javascript - 为什么箭头函数的 'this' 在嵌套对象字面量中没有变化?

标签 javascript ecmascript-6 this object-literal arrow-functions

<分区>

我发现在嵌套对象文字中使用箭头函数时,“this”关键字似乎总是指向 global

根据其他问题,以下代码片段可以解释为箭头函数的“this”是在词法上下文中定义的。

var c = 100;
var a = {c:5 , fn: () => {return this.c;} };
console.log(a.c); //100

但是,我无法理解以下代码(嵌套对象字面量):

var c = 100;

var a = {
    c: 5,
    b: {
        c: 10,
        fn: ()=> {return this.c;}
    }
}

console.log(a.b.fn());// still 100, why not 5?

我的意思是,如果从词法上下文方面考虑,a.b.fn中的'this'不应该指向a吗?

为什么无论对象嵌套了多少层,所有的“this”实例都指向窗口或全局?

最佳答案

JavaScript 中唯一改变作用域的表达式是函数,从 ES6 开始,它是 block (请注意,对象字面量不是 block ,尽管它周围有大括号)。这意味着:不在函数内部的所有内容都在全局范围内。

在全局范围内,this 指的是全局对象(在浏览器中是window)。唯一改变作用域的是箭头函数(是的,它们确实改变了作用域!)——但它在词法上绑定(bind)了 this(这意味着,它使用外部作用域中的 this),所以它仍然是全局对象。

如果您希望 this 引用 a 对象,请使用 IIFE 而不是对象字面量:

var c = 100;

var a = new function () {
    this.c = 5;
    this.b = {
        c: 10,
        fn: ()=> {return this.c;}
    }
}()

alert(a.b.fn()) // 5;

或者,将 b 绑定(bind)到 this:

var c = 100;

var a = {
    c : 5,
    b : new function () {
        this.c = 10;
        this.fn = ()=> {return this.c;}
    }()
}

alert(a.b.fn()) // 10;

或者,要将 this 绑定(bind)到 b,您也可以使用常规函数代替箭头函数:

var c = 100;

var a = {
    c: 5,
    b: {
        c: 10,
        fn: function () {return this.c;}
    }
}

alert(a.b.fn()) // 10;

关于javascript - 为什么箭头函数的 'this' 在嵌套对象字面量中没有变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37643169/

相关文章:

javascript - 如何使用 ng grid 在 AngularJS 中实现原始标题和列标题

javascript - Microsoft Edge 中的 beforeunload 未触发

javascript - 扩展命名空间 JS 导入

javascript - 哪个是第一个被调用的?构造函数或 componentDidMount 或 Render

JQuery 仅使用 html() 抓取特定文本

javascript - "new"这个词将函数更改为对象?

javascript - 更改时弹出 slider 的值

javascript - 运行 JavaScript 模块返回 SyntaxError : Unexpected token export

c++ - 构造函数和 "this"指针

javascript - QUnit 忽略源错误