箭头函数的this指向问题

图片描述

箭头函数的this是在定义时就确定了,那obj.foo()的this应该指向obj啊,
为什么打印出来是window?

阅读 7.9k
7 个回答

箭头函数中的this是指向外部作用域中的this,你在执行obj.foo()时,foo的当前作用域是obj,外部作用域是window,所以得到window。你所说的obj.foo()的this应该指向obj是普通函数的情况,即:

var obj = {
    foo: function () {
        console.log(this)
    }
}

由于箭头函数的this指向外部作用域的this,所以要达到你说的效果,应该把foo再包装一层:

var obj = {
    foo: function () {
        /* 这是foo的作用域 */
        (() => {
            /* 这是箭头函数的作用域 */
            console.log(this)
        })()
    }
}

此时调用obj.foo()时,foo作用域的thisobj,内部的箭头函数指向外部作用域的this,即foo作用域下的this,因此得到obj

1.箭头函数作为函数的一种形式,对于this的处理和普通函数有所区别,其没有自己的this上下文,也就是说通过bind/call/apply函数方法设置this值时无效的,会被忽略
2.因为箭头函数没有自己的this上下文,那么当它作为对象的方法函数运行时,this并不指向这个对象
3.箭头函数的的函数体中出现的this在运行时绑定到最近的作用域上下文对象
4.你可以认为箭头函数的this和调用者无关,只和其定义时所在的上下文相关

对于问题中的代码

var obj = {
    foo: () => console.log(this)
}

运行foo箭头函数时,将会查找this绑定的上下文对象,如果obj定义在一个函数体内,那么这个this就绑定到这个函数体对应的this对象上;如果定义在一个全局作用域下,那么就绑定到全局window对象上(浏览器环境下)

function objWrapper(){
    var a=10;
    var obj = {
        foo: () => console.log(this.a)
    };
    obj.foo();
}
objWrapper.call({a:20});//20
objWrapper();//undefined

clipboard.png

babel官网实时编译结果。

个人理解:
箭头函数应该是为ES6的模块化定制的。

this 指向外层函数作用域。(不是外层对象哦)

箭头函数不会产生自己作用域下的this,除了this还包括 arguments, super 和 new.target 等对象

箭头函数没有自身的 this, arguments, super, new.target, 而是通过上溯词法作用域找到最近定义的那个.

var obj = {
    foo: () => console.log(this)
}

这段代码里箭头函数里头的 this 指向的是定义了箭头函数的那个执行上下文, 显然即 window.

var obj={a:this};
console.log(obj.a)

哪错了?既然要踩就把问题指出来,谢谢。
这么不就能看在对象中的this究竟是什么吗?箭头函数找的不也是同一个this?
箭头函数的this不是就近取的吗?
要从所在环境就近取this,最近的this就是window.

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