我发现在嵌套对象文字中使用箭头函数时,“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;