关于箭头函数的疑问

箭头函数的this指向定义时的对象。

    var obj = {a:'obj'};
    var fun = function(){
        setTimeout(()=>console.log(this),2000);
    };
    var fun1 = ()=>{
        setTimeout(()=>console.log(this),2100);
    };
    fun();
    fun.call(obj);
    fun1();
    fun1.call(obj);

有点不理解上述例子的输出,fun和fun1的输出都是window,fun.call输出obj,fun1.call输出window。
主要的疑问在于为什么fun1不可用绑定obj,fun可以绑定。

阅读 4.5k
3 个回答

建议去读一下《understanding ECMAScript2015》,函数扩展那一章对箭头函数讲的很透彻,包括它的call,bind,apply为什么无效,这里简单的提一下

箭头函数没有this、super、arguments,也没有new.target绑定
这些属性由所在的、最靠近的非箭头函数来决定

箭头函数不能被new调用,没有construct方法

箭头函数没有原型,也就是没有prototype属性

箭头函数不能更改this,this值在函数的整个生命周期内保持不变

因为没有arguments对象,必须依赖具名参数或剩余参数访问函数的参数,但是箭头函数可以访问包含它的函数体的arguments,而且无论在何处执行,该对象都是可用的

如果箭头函数被包含在一个非箭头函数内,那么this值就与该函数相等,否则this值就会是全局对象

箭头函数被设计为「抛弃型」函数,因此不能被用于定义新的类型

PS:上边提到的那本书中有讲为什么箭头函数会有这些行为,和javascript高级程序设计是一个作者,写书超级棒!

箭头函数没有自身的this this在箭头函数中已经按照词法作用域绑定了 所以没有办法用call/apply来改变this指向

箭头函数会捕获其所在上下文的 this 值,作为自己的 this 值,call() 或 apply()对 this并没有影响

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题