Javascript 对象方法上的setTimeout-ES5绑定还是闭包?

Javascript 对象方法上的setTimeout-ES5绑定还是闭包?,javascript,html5-canvas,Javascript,Html5 Canvas,假设我正在用HTML5画布制作一些动画。如果我想为一个对象的方法设置动画,从性能角度看,哪一个更可取(假设我不关心IE8): 或 我的特殊情况不足以在视觉上产生真正的影响;我只是想找出最好的做法 我认为用bind创建一个新函数比创建闭包的开销要小,但我想问问专家 JavaScript性能问题很棘手,因为不同的引擎具有非常不同的性能特征。一台发动机的速度快,另一台发动机的速度慢 你的结束应该非常快;毕竟,所有函数都是闭包,而您的self变量是在直接包含的上下文中定义的(因此没有太多的范围链来查找它

假设我正在用HTML5画布制作一些动画。如果我想为一个对象的方法设置动画,从性能角度看,哪一个更可取(假设我不关心IE8):

我的特殊情况不足以在视觉上产生真正的影响;我只是想找出最好的做法


我认为用
bind
创建一个新函数比创建闭包的开销要小,但我想问问专家

JavaScript性能问题很棘手,因为不同的引擎具有非常不同的性能特征。一台发动机的速度快,另一台发动机的速度慢

你的结束应该非常快;毕竟,所有函数都是闭包,而您的
self
变量是在直接包含的上下文中定义的(因此没有太多的范围链来查找它)

但从理论上讲,一个本机支持ES5功能的引擎可以优化
bind
的工作方式,使其更快(甚至不需要单作用域链查找)


这有关系吗?不,我会用对你有意义的东西。请注意,IE8并不是唯一一款本机还没有ES5功能的浏览器(尽管您始终可以使用一个es5垫片;与某些es5功能不同,
bind
可以由ES3代码中的垫片完美模拟-尽管要做到这一点,他们必须使用
call
/
apply
,这可能比某些发动机上的关闭速度慢).

这对我来说有点过于优化的味道,我也不知道你的问题是什么,但我认为可以肯定的是,75%的情况下这不是matter@mkoryak-只有在做更多工作的情况下,这才是过度优化。两者都很容易实现,我想知道哪一个是(潜在的)更高的性能。如果不考虑浏览器支持,请使用
.bind()
。它的全部目的是消除对
var self=this
黑客的需要。@Rob-你确定吗?
这个
在setTimeout回调中是未定义的/window,但是render被作为
self
的一种方法调用,因此,一旦render命中,
这个
就是它应该的样子。但是你知道,你只是如果说您传递给setTimeout的实际函数之间存在细微的、迂腐的差异,对吗?@amnotiam the意味着它们至少在实现上非常相似,最多只保存一个词汇范围查找,最多它们是等价的。
setTimeout(this.render.bind(this), 15);
var self = this;
setTimeout(function () { self.render() }, 15);