我最近遇到這個問題。對於我正在開發的項目,我們經常使用.bind()方法,考慮到渲染循環只有16ms的功能,所以它實際上很難達到性能。爲什麼native .bind()這麼慢?
所以我做了一些jsperf,並且注意到調用一個綁定函數(除了額外的垃圾)比調用一個未綁定的函數或在函數上使用.call慢得多。
我從字面上改變了每一段代碼以避免綁定,並使用.call/.apply代替。丁這個我不僅產生了更少的功能,而且還增加了我的應用程序的性能很大。
但是,我對此並不滿意,並寫了一種綁定函數的新方法。 https://github.com/SebastianNette/FastBind
這是用.call/.apply方法覆蓋原生綁定方法。它運行速度快96%。
在nodejs上做了一些測試得出這些結果: 調用綁定函數比調用未綁定函數慢20倍。 用我自己的方法調用綁定函數只需要2倍的未綁定調用時間。
所以我想知道原生綁定函數有什麼問題。爲什麼它的行爲如此?這將是處理這個問題的最佳方式。
我大部分的應用程序代碼現在寫的是:
var scope = this;
this.boundFn = function(a,b,c) { return scope.fn(a,b,c); };
甚至
this.callback = fn;
this.context = context;
this.callback.call(this.context);
我更喜歡後者因爲它不會產生任何新的功能。但是,有時我只是必須綁定。 (處理程序,定時器等)。
'.call'和'.apply'據我瞭解,做了'this'關鍵字的東西相對於非常不同的,和上下文。如果你避免使用'this'關鍵字,那麼你應該沒問題。但是,警告的話,你正在創建的lambda正在創建閉包,如果你不小心的話(這些函數會引用'scope')會泄漏內存。 – Aron 2015-03-25 08:48:34