javascript - setTimeout范围问题

标签 javascript

我在控制玩家重生的函数内部定义了一个 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/

相关文章:

javascript - 在 ui-router 状态下加载共享模型

javascript - 通过Jquery更改表列的内容

javascript - Mongoexport 在日期范围内使用 $gt 和 $lt 约束

javascript - 具有自动完成功能的 InputMask

javascript - jQuery ID 以

javascript - 滚动元素以水平查看

javascript - 如何修复表单控件中的空数组而不使用 mySql(PHP、AJAX、JQuery、JS)

javascript - 两部分主页像 tumblr 起始页

javascript - 页面加载时显示模态

javascript - 在 javascript/jquery 中通过引用和值传递