作为参数

时间:2016-10-28 07:33:17

标签: javascript arguments parameter-passing

我对此很陌生,偶然发现了这个奇怪的事情:

我正在使用函数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)为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

在函数=QUERY(Sheet1!A:F, "select A,B,avg(F), count(F) where A<>'' and B<>'' and '"&A5&"' contains A and '"&A5&"' contains B group by A,B label A'',B'', avg(F)'',count(F)''" ) 中,您在回调中传递requestAnimationFrame()全局对象,实际上您将参数名称设置为myObj仅可访问在回调函数范围内,根据DOMHighResTimeStamp文档,类型为requestAnimationFrame()

答案 1 :(得分:1)

当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));