【问题标题】:Object turns into number when passed as argument对象作为参数传递时变成数字
【发布时间】:2016-10-28 07:33:17
【问题描述】:

我对此很陌生,只是偶然发现了这个奇怪的东西:

我正在使用函数requestAnimationFrame 并且必须将对象作为参数传递。 This Question 向我展示了如何将参数传递给回调函数,但是当我传递一个对象时,它在函数内变成一个(看似随机的)数字:

var myObj = {name : "Sanchez",  surname: "Pedro"};

console.log("outside", myObj);          // shows me the object
console.log("outside", typeof(myObj));  // object

requestAnimationFrame(function(myObj) {

    console.log("inside", myObj);          // shows me a random number
    console.log("inside", typeof(myObj));  // number
    // doSomethingToPedro(myObj)

});

(see jsFiddle)

我现在的问题是,(A)我怎样才能正确地将我的对象传递给回调,以及(B)为什么会发生这种情况?

【问题讨论】:

  • requestAnimationFrame 发送高清时间作为参数。同样在回调内部,myObj 指向参数而不是外部变量
  • 参数的值是在调用函数时分配的,而不是在定义函数时。

标签: javascript arguments parameter-passing


【解决方案1】:

在函数requestAnimationFrame() 中,您没有在回调中传递myObj 全局对象,您实际上将参数名称设置为myObj,只能在回调函数范围内访问,根据requestAnimationFrame() 文档,它属于DOMHighResTimeStamp 类型。

【讨论】:

    【解决方案2】:

    当 JavaScript 调用您的回调时,它会将 DOMHighResTimeStamp 时间作为第一个参数传递,而在您的示例中 myObj 就是这个参数,这就是为什么它是一个数字。文档中提到了这一点:

    指定更新时要调用的函数的参数 下一次重绘的动画。回调只有一个 参数,一个 DOMHighResTimeStamp,它指示当前时间( 当 requestAnimationFrame 时从 Performance.now() 返回的时间 开始触发回调。

    您的编码方式是结构化的,您不需要将myObj 传递给回调,因为无论如何它都可以通过闭包机制访问:

    var myObj = {name : "Sanchez",  surname: "Pedro"};
    requestAnimationFrame(function(timestamp) {
        doSomethingToPedro(myObj) // I'm accessible through closure
    });
    

    如果还想显式传递对象,可以使用bind函数绑定参数:

    requestAnimationFrame(function(myObj, timestamp) {
        doSomethingToPedro(myObj) // I'm accessible through bound value
    }.bind(null, myObj));
    

    【讨论】:

    • 如此简单,如此完美。谢谢!
    • 不客气,如果回答了你的问题,你可以接受它:)。我还为您的问题提供了两种解决方案。
    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多