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. 编写代码时应该首选哪个?

这可能有点取决于应该首选哪个。我倾向于使用后者(虽然实际上我更喜欢前者,但我们使用的一些第 3 方库限制了它)。我认为选择风格最重要的是保持一致。

关于 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");