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

时间:2012-01-19 15:40:37

标签: javascript html5-canvas

假设我正在使用HTML5 Canvas做一些动画。如果我想要一个对象的方法动画,这将是更好的,性能明智(假设我不关心IE8):

setTimeout(this.render.bind(this), 15);

var self = this;
setTimeout(function () { self.render() }, 15);

我的特殊情况并不足以在视觉上真正发挥作用;我只是想找出最好的做法。

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

1 个答案:

答案 0 :(得分:5)

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

你的关闭应该非常快;毕竟,所有函数都是闭包,你的self变量是在包含立即数的上下文中定义的(所以没有很多内容可以查看它的范围链)。

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

重要吗?不,我会使用对你有意义的东西。请注意,IE8并不是唯一一个本身没有ES5功能的浏览器(尽管你总是可以使用其中一个es5垫片;与某些ES5功能不同,bind可以通过ES3中的垫片完美模拟代码 - 尽管要这样做,他们必须使用call / apply,这可能比某些引擎上的闭包慢。