2012-01-19 36 views
8

假設我正在用HTML5 Canvas做一些動畫。如果我期待的動畫對象的方法,這將是可取的,明智的性能(假設我不關心IE8):對象方法setTimeout - ES5綁定或關閉?

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

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

我的具體情況是不足夠強烈,以真正在視覺上有所作爲;我只是想找出最佳做法。

我認爲用bind創建一個新函數的開銷比創建閉包要少,但我想問專家。

+1

這味道就像過度優化給我,然後我不知道你的問題是什麼,但我認爲它可以安全地說,75%的時間這並不重要 – mkoryak

+0

他們都創建一個閉包,唯一的區別是什麼範圍這些功能綁定在... –

+2

@mkoryak - 如果您正在做更多工作,它只會過度優化。兩者都是微不足道的實施,我想知道哪個(可能)更高性能。 –

回答

5

JavaScript的性能問題很棘手,因爲那裏的各種引擎具有非常不同的性能特徵。一個引擎上的速度很慢,另一個引擎上的速度很慢

你的關閉應該非常快;畢竟,所有函數都是閉包,你的self變量是在包含直接內容的上下文中定義的(所以沒有太多關注它的範圍鏈)。

但理論上,本機支持ES5功能的引擎可以優化bind的工作方式,使其更快(不需要甚至只需要一個範圍鏈查找)。

重要嗎?不,我會使用對你有意義的事情。請注意,IE8並不是僅有的本機尚未具備ES5功能的瀏覽器(儘管您始終可以使用其中一個ES5墊片;與某些ES5功能不同,bind可以完美地用ES3代碼  —中的墊片來模擬,但要做到這一點,他們必須使用call/apply,這可能比某些引擎上的封閉要慢)。