将对象函数传递给请求动画帧时丢失对象引用
Losing object reference when passing object function to requestAnimationFrame
我想知道为什么这些代码变体的行为方式
。首次设置:
var a = {
val: 23,
div: null,
test: function(){
this.div.innerHTML = this.div.innerHTML + ' ' + this.val;
},
run: function(){
// why is "this" the window object here when called by requestAnimationFrame?
requestAnimationFrame(this.run);
this.test();
},
init: function(){
this.div = document.getElementById('output');
this.run();
}
};
a.init();
这个我希望工作,但一旦requestAnimationFrame
开始调用run
函数就失败了,因为this
在被requestAnimationFrame
调用时指的是Window
。小提琴:http://jsfiddle.net/titansoftime/gmxourcq/
这个工作:
var a = {
val: 23,
div: null,
test: function(){
this.div.innerHTML = this.div.innerHTML + ' ' + this.val;
},
run: function(){
var self = this;
requestAnimationFrame(function(){ self.run(); });
this.test();
},
init: function(){
this.div = document.getElementById('output');
this.run();
}
};
a.init();
通过闭包传递run
函数可以解决这个问题。为什么这会起作用,而不是前面的示例起作用?我的实际代码需要非常高效地运行,我宁愿不要在我的运行循环中使用闭包,因为我不想戳 GC。也许这没什么大不了的?(我最担心的是移动设备)。小提琴:http://jsfiddle.net/titansoftime/Lqhcwoyu/
最后是按预期工作的最后一种情况:
var a = {
val: 23,
div: null,
test: function(){
this.div.innerHTML = this.div.innerHTML + ' ' + this.val;
},
run: function(){
requestAnimationFrame(a.run);
a.test();
},
init: function(){
this.div = document.getElementById('output');
this.run();
}
};
a.init();
同样出于性能(强迫症)的原因,如果可以避免的话,我宁愿不通过全局引用此对象。小提琴:http://jsfiddle.net/titansoftime/5816fLxe/
有人可以向我解释为什么第一个示例失败,以及尽可能高效地运行此循环的最佳方法吗?
谢谢你的时间。
传递给
requestAnimationFrame
的函数引用在全局上下文中执行(其中this
在浏览器中引用window
对象)。
为了在任何其他作用域中执行传递给 requestAnimationFrame 的函数引用,您需要将函数引用绑定到该作用域:
requestAnimationFrame(this.run.bind(this));
或者传入一个匿名包装函数,该函数本质上在其原始作用域中执行您的函数(这就是您在此处所做的)。
var self = this;
requestAnimationFrame(function(){ self.run(); });
相关文章:
- 如何使用object.assign()从其他对象引用基本对象属性
- 返回 JavaScript 类值而不是对象引用
- Facebook:当发布期望对象引用时显示打开的图形对话框
- Javascript-如何从字符串/对象引用回调
- 将其用于对象引用
- 如何将对象引用传递到 mootools 中另一个对象的构造函数中
- Javascript:将类/对象引用设置为 NULL,内存中的子对象/类会发生什么
- 在 Jquery 中,我可以存储对象引用并在以后使用它吗?
- 将对象函数传递给请求动画帧时丢失对象引用
- JavaScript ecma6中的对象引用
- 在JSON中存储对象引用
- 为什么可以在内部函数成员中访问对象引用,而不能在内部属性成员中访问
- 对象引用的隐式传递是如何工作的
- 按对象的 ID 删除对选定对象的对象引用
- 在调用的函数中使用对象引用(this)
- 如何在testcomplete+js中获取对象引用
- 在Angularjs服务中为返回对象引用的http请求提供的数据构建简单的缓存
- JavaScript对象引用
- 如何在基于json数据的Javascript中为网页上的多个对象设置动画
- 从对象引用请求动画帧时出错