【问题标题】:JavaScript - Function Not Modifying Global VariableJavaScript - 函数不修改全局变量
【发布时间】:2011-09-03 05:29:27
【问题描述】:

我在用 JavaScript 编写代码的文本冒险游戏中修改变量时遇到问题。我想使用函数中的函数更改全局变量的值(不,不是闭包)。

/*This is just example code.*/
    var health = 100;
    var exp = 0;

    function refreshStats() {
      health -= 10;
      exp += 1;
    }

    function foo(flag) {
      if (flag == DONOTHING) {
        refreshStats();
      }

      if (health <= 0) {
        say("You died, bwahaha.");
      }

      if ((exp/10) == Math.floor(exp/10)) {
        health += 10;
        say("You leveled up!");
      }
    }

游戏的运作方式是,每个功能(定义为游戏中的动作或区域)将由由 JavaScript 放置的按钮和表单调用,用户可以分别单击或写入这些按钮和表单。我需要 refreshStats() 来更新 health 和 exp 变量,以便 foo() 可以正确使用它们;在 foo() 运行之前,该函数似乎不会更新变量。我确实想知道这是否是浏览器兼容性问题,这真的会让我感到厌烦,但我希望不是这样。

有什么建议吗?

【问题讨论】:

  • 最佳猜测。您的“全局”变量实际上并未在全局范围内定义,因此不同的代码段正在修改变量的不同范围副本。但是,如果没有看到真实的代码和它周围的上下文,就无法知道这一点。
  • DONOTHING 是一个变量,还是应该是字符串“DONOTHING”?
  • DONOTHING 是一个类似标志的变量,但我没有在示例代码中定义它。我知道在这种情况下它不会起作用,但我更关心的是全局变量,而不是标志(实际代码中的标志是正确定义的)。

标签: javascript global-variables


【解决方案1】:

将您的值存储到您的窗口对象中,以便在该窗口的任何范围内都可用:

//take care to not overwrite native properties of the window
window.health = 100;
window.exp = 0;

function refreshStats() {
  health -= 10;
  exp += 1;
}

【讨论】:

    【解决方案2】:

    看起来像it's working for me。也许这是一个范围界定问题 - 您可以发布实际相关代码而不是示例代码吗?

    【讨论】:

    • 更多评论,即使相关。
    • 您的代码缺少 if-else 语句,这些语句获取变量的值来决定您是否死亡。像 alert() 这样的函数和像 log() 这样的方法会按原样显示变量,但不会显示 if-else 语句。
    • @zero 这没有任何意义..变量在任何时间点的值都是相同的,无论它是 alert()ed 还是在条件中评估。贴一些真实的代码,因为其他事情正在发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多