javascript - Javascript 中函数绑定(bind)和闭包的区别?

标签 javascript function closures bind

当我们需要使用当前上下文对象调用 javascript 函数时,我看到有两个选项,例如:

  1. 使用函数绑定(bind)
  2. 使用 Javascript 闭包

函数绑定(bind)示例

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

关于javascript - Javascript 中函数绑定(bind)和闭包的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31244229/

相关文章:

javascript - Expressjs中间件中定义的静态变量

ios - 将 block 形式的 objective-c 解决为 swift 3

javascript - Meteor.js 安全地嵌入 iframe

function - 这个 erlang 函数中的递归调用是如何工作的?

javascript - 如何按顺序处理函数而不是同时处理所有函数

swift - 为多个swift参数设置相同的值

javascript - 如何从闭包函数调用中返回相同的值 n 次?

javascript - 下载二进制文件而不触发 onbeforeunload

javascript - res.write 没有返回预期值

javascript - 如何根据绝对容器中响应图像的高度设置父(相对)的动态高度