簡體   English   中英

Javascript中函數綁定和閉包之間的區別?

[英]Difference between Function Binding and Closure in Javascript?

當我們需要用當前上下文對象調用javascript函數時,我看到有兩個選項,如:

  1. 使用函數綁定
  2. 使用Javascript關閉

函數綁定示例

myProject.prototype.makeAjax = function() {
  $.get('http://www.example.com/todoItems', function success(items) {
   this.addItemsToList(items)
  }.bind(this));
}

JS閉包的示例

myProject.prototype.makeAjax = function() {
  var that = this;

  $.get('http://www.example.com/todoItems', function success(items) {
   that.addItemsToList(items)
  });
}

我想問問:

  1. 哪兩個在性能方面更好?
  2. 在編寫代碼時應該首選哪個?

它可能取決於哪個應該是首選。 我傾向於使用后者(雖然實際上我更喜歡前者,但我們使用的一些第三方庫限制了這一點)。 我認為選擇風格的重要一點是保持一致。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM