【发布时间】:2020-08-23 22:53:52
【问题描述】:
我有一些由装饰器分配的对象的方法(这就是函数 f 和 ms 的来源)。
function() {
setTimeout(() => f.apply(this, arguments), ms);
};
'this' 在这里指的是对象。但是 setTimeout 的“this”是窗口,而不是那个对象。如果箭头函数的“this”是从词法上获取的,那么为什么它不是从 setTimeout 中获取的呢?毕竟在下面的代码中:
let user = {
firstName: "Ilya",
sayHi() {
let arrow = () => alert(this.firstName);
arrow();
}
};
user.sayHi(); // Ilya
'this' 取自上面的函数。因此,如果该函数在第一种情况下是 setTimeout,为什么两种情况不一样?我认为这可能与在一种情况下作为参数传递的函数有关,在另一种情况下作为局部变量传递,但这在词法环境中不会归结为相同吗?
为什么会有差异?
另外,测试一下:
let obj = {name : "Jeff"};
let obj2 = {name : "Bart", fun2 : function(fun){fun();}};
obj.name2 = obj2.fun2(() => alert(this.name));
但现在我没有收到“Bart”警报,而是一个空字符串。当我用长度替换“名称”时,我只得到 0,“this”指的是窗口。
为什么不能按预期工作?
【问题讨论】:
-
您已将箭头函数作为回调函数传递给
setTimeout,因此此回调中的this将引用封闭范围内的this,即对象的方法。函数使用定义它们的作用域,而不是调用它们的作用域。您传递给setTimeout的箭头函数未在setTimeout中定义。 -
"'this' 在这里指的是对象。但是 setTimeout 的 'this' 是窗口",
this从未设置为任何对象,而是指向窗口对象。 -
我的意思是setTimeout是window的一个方法,所以我以为箭头函数会在setTimeout里面声明,从而导致setTimeout作为'this'值的来源
标签: javascript this