箭头函数的this是继承自上层作用域的吗,为什么不能被bind?

this可以看作一个变量吗?
箭头函数没有this,如果它的this是从作用域链继承而来的,是不是就相当于一个闭包。
箭头函数使用this时就是使用的外层的this,不知道这样理解对不对。

bind函数内部是如何影响this的指向的,如果箭头函数的this是继承来的,为什么不能被改变。

阅读 5k
4 个回答

箭头函数的特点之一就是不绑定新的this,所以箭头函数的this是在词法层面就绑定到了外层作用域,他的this只能是来自外层作用域的this,无论你通过什么方式都不能改变,除非你修改了外层作用域的this。

像apply、call、bind方法都只是在语法层次来修改函数的this指向。

关于bind的函数的实现,这里贴一个bind的polyfill:

if (!Function.prototype.bind) {
  Function.prototype.bind = function(oThis) {
    if (typeof this !== 'function') {
      // closest thing possible to the ECMAScript 5
      // internal IsCallable function
      throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
    }

    var aArgs   = Array.prototype.slice.call(arguments, 1),
        fToBind = this,
        fNOP    = function() {},
        fBound  = function() {
          return fToBind.apply(this instanceof fNOP
                 ? this
                 : oThis,
                 // 获取调用时(fBound)的传参.bind 返回的函数入参往往是这么传递的
                 aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    // 维护原型关系
    if (this.prototype) {
      // Function.prototype doesn't have a prototype property
      fNOP.prototype = this.prototype; 
    }
    fBound.prototype = new fNOP();

    return fBound;
  };
}

具体可以参考MDN上的两篇教程:

  1. 箭头函数
  2. bind

箭头函数没有this。
类似于

function block (){
  let _this = a
  () => { console.log(_this) }
}

因为箭头函数本身是没有this的,所以才会去找声明时最近的this(就近)

https://developer.mozilla.org...

箭头函数表达式的语法比函数表达式更短,并且不绑定自己的this,arguments,super或 new.target。这些函数表达式最适合用于非方法函数,并且它们不能用作构造函数。

你可以认为它创建时已经bind了。我知道解释器不一定这么实现,但它的行为是等价的。

var f = function(args) {/*...*/}.bind(this)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题