[英]Difference between Function Binding and Closure in Javascript?
當我們需要用當前上下文對象調用javascript函數時,我看到有兩個選項,如:
myProject.prototype.makeAjax = function() {
$.get('http://www.example.com/todoItems', function success(items) {
this.addItemsToList(items)
}.bind(this));
}
myProject.prototype.makeAjax = function() {
var that = this;
$.get('http://www.example.com/todoItems', function success(items) {
that.addItemsToList(items)
});
}
我想問問:
它可能取決於哪個應該是首選。 我傾向於使用后者(雖然實際上我更喜歡前者,但我們使用的一些第三方庫限制了這一點)。 我認為選擇風格的重要一點是保持一致。
prototype.bind的注釋是IE8不支持它,這可能會導致你出現問題。
我認為性能明智,我希望bind
有點慢,因為你在那里調用一個額外的函數,但它可能取決於瀏覽器優化。 我會嘗試將一個jsperf
示例放在一起,當他們的網站回來回答問題的那一部分時。
更新
似乎JSPerf不會很快就會出現。 這是我放在一起的一個片段,顯示關閉更快(假設我做得正確)。 封閉的速度略快超過7倍。 如果在控制台打開的情況下運行,您將看到時間。
var limit = 100000; var a = { val: 0, do: function(i) { val = i; /* Actually do some work to ensure doesn't get optimised out */ } }; var b = { myFunc: function(callback) { callback(); /* Function that's going to change this keyword */} }; var start = +new Date(); for(var i = 0; i < limit; i++) { b.myFunc(function() { this.do(i); }.bind(a)); }; var end = +new Date(); var diff = end - start; console.log("bind took " + diff + " ms"); var start = +new Date(); for(var i = 0; i < limit; i++) { var that = a; b.myFunc(function() { that.do(i); }); }; var end = +new Date(); var diff = end - start; console.log("closured took " + diff + " ms");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.