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

use*_*291 21 javascript

如上所述:

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

闭包还可用于解决this关键字的问题,该关键字对每个范围都是唯一的.在处理回调时,此机制特别有用,但在这些情况下,通常最好使用Function.bind,这将避免与范围遍历相关的任何开销.

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

Pan*_*lis 10

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

console.log(self.myName, this.myName);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • *代码执行速度变慢* - 这完全错误,如sbr的评论和其他SO问题所示:http://stackoverflow.com/questions/17638305/why-is-bind-slower-than-a-closure (3认同)

Ray*_*nos 8

它所指的是这样的事情

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

VS

obj.doSomething = function() {
  setTimeout((function() {
    // this is the obj
    this.doSomethingElse();
  }).bind(this), 50);
};
Run Code Online (Sandbox Code Playgroud)

基准.铬没有明显的区别.

  • 使用`this`关键字是面向对象编程的基础.我建议不要反对@Raynos给出的建议. (11认同)