在Javascript中的Function.bind vs Closure:如何选择?

时间:2011-06-18 15:43:54

标签: javascript

如上所述:

http://jqfundamentals.com/book/index.html

  

闭包还可用于解决this关键字的问题,   这是每个范围的独特之处。这个   机制可能特别有用   在处理回调时,尽管在   那些情况下,使用起来往往更好   Function.bind,这将避免任何   与范围相关的开销   遍历。

但它并没有真正说明如何区分这两种情况。实际上我并不理解作者的意思是“避免与范围遍历相关的任何开销”。你能解释一下吗?

2 个答案:

答案 0 :(得分:9)

请看上面链接中示例中的这一行

console.log(self.myName, this.myName);

(自我=这;上面几行)。闭包定义了outerFunction方法,它存在于不同的范围内,这就是为什么它与outerObj对象具有不同的值。 (self.myName!= this.myName)

范围遍历意味着,当您要获取存在于不同范围内的值(变量,对象)时,会增加额外开销(代码执行速度变慢)。

使用bind,您正在调用具有现有范围的函数,因此不会进行范围遍历。

答案 1 :(得分:7)

它指的是这样的事情

obj.doSomething = function() {
  var that = this;
  setTimeout(function() {
    // this is the window
    // that is the obj
    that.doSomethingElse();
  }, 50);
};

VS

obj.doSomething = function() {
  setTimeout((function() {
    // this is the obj
    this.doSomethingElse();
  }).bind(this), 50);
};

Benchmark。铬没有明显的区别。