我对此很陌生,偶然发现了这个奇怪的事情:
我正在使用函数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)
});
我的问题现在是,(A)我如何正确地将我的对象传递给回调,以及(B)为什么会发生这种情况?
答案 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));