MDN提供了以下两个箭头函数示例
示例1
var adder = {
base: 1,
addThruCall: function(a) {
var f = v => v + this.base;
var b = {
base: 2
};
return f.call(b, a);
}
};
console.log(adder.addThruCall(1)); // 2
示例2
'use strict';
var obj = {
i: 10,
b: () => console.log(this.i, this),
c: function() {
console.log(this.i, this);
}
}
obj.b(); // prints undefined, Window {...} (or the global object)
obj.c(); // prints 10, Object {...}
问题
this.base
指向adder.base
this.i
的b
解析为undefined
如果箭头功能没有this
值,那么this.base
也不应该解析为undefined
吗?
答案 0 :(得分:2)
在示例1中,箭头函数f
是在addThruCall
内的函数adder
内创建的。这意味着this
内的f
将指向addThruCall的this
,即adder
。
在示例2中,箭头函数b
不在任何正常函数内,因此其this
不指向任何位置。
不是箭头函数没有this
值,箭头函数不会改变它们创建的this
值。
答案 1 :(得分:2)
箭头功能有一个"这个",它是什么"这个"当你定义它们时,它在当前范围内。
在第二个例子中,在箭头函数b()
中,因为你没有特定的父范围定义"这个","这个"指向" Window" (在浏览器上下文中)
同样在第二个示例中,在命名函数c()
中,function()...
引入了一个范围,默认情况下为undefined
。
所以你看到的是完全可以预期的。但是,正如你所看到的,"这个"很难掌握,所以好的代码风格建议尽可能避免它。在这种情况下,您可能希望使用闭包。
在另一个问题中有趣地读到了这个:How does the "this" keyword work?