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

Ada*_*kis 8 javascript html5-canvas

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

setTimeout(this.render.bind(this), 15);
Run Code Online (Sandbox Code Playgroud)

要么

var self = this;
setTimeout(function () { self.render() }, 15);
Run Code Online (Sandbox Code Playgroud)

我的特殊情况不够强烈,无法在视觉上真正发挥作用; 我只是想找出最好的做法.

我认为创建一个新函数bind比创建一个闭包更少开销,但我想问专家.

T.J*_*der 5

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

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

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

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