gpt4 book ai didi

javascript - setTimeout范围问题

转载 作者:行者123 更新时间:2023-12-02 23:39:49 25 4
gpt4 key购买 nike

我在控制玩家重生的函数内部定义了一个 setTimeout (我正在创建一个游戏):

var player = {
...
death:(function() {
this.alive = false;
Console.log("death!");
var timer3 = setTimeout((function() {
this.alive = true;
Console.log("alive!");
}),3000);
}),
...
}

当它执行时,我在控制台中读到“死亡!” 3秒后“还活着!”。但是,alive 永远不会真正设置回 true,因为如果我在控制台中写入 player.alive,它会返回 false。我怎么能看到“活着!”但变量永远不会设置回 true?

最佳答案

你必须小心这个。您需要将外部作用域中的 this 分配给一个变量。 this 关键字always指的是当前作用域的this,只要您将某些内容包装在 function() { 中,它就会发生变化。 .. }.

var thing = this;
thing.alive = false;
Console.log("death!");
var timer3 = setTimeout((function() {
thing.alive = true;
Console.log("alive!");
}),3000);

这应该会给你带来更好的成功。

更新 2019-10-09: 最初的答案是正确的,但现在可以为最新版本的 JavaScript 提供另一个选项。您可以使用箭头函数代替 function,它不会修改 this:

this.alive = false;
Console.log("death!");
var timer3 = setTimeout(() => {
this.alive = true;
Console.log("alive!");
}), 3000);

这是从 ES6 开始支持的,我认为这是除 IE(当然)之外的所有当前浏览器的一部分。如果您使用现代框架通过 Babel 或其他方式构建项目,该框架应该确保它在任何地方都能按预期工作。

关于javascript - setTimeout范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11714397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com