【问题标题】:Why does this conditional work?为什么这个条件有效?
【发布时间】:2018-01-17 19:59:00
【问题描述】:

这个条件是如何工作的:

    function play(){
    if (typeof gameInterval != "undefined")
        clearInterval(gameInterval);
        gameInterval = setInterval(gameLoop, 100);
        allowPressKeys = true;
}

变量gameInterval只定义在这个函数内部,没有全局变量。 所以当 play() 被称为 gameInterval 时是未定义的。由于这个条件在未定义 gameInterval 时会起作用,所以我不明白它为什么起作用。有人可以解释吗?我正在尝试理解这一点,以便稍后在我的代码中对其进行操作。

【问题讨论】:

  • 如果不是全局的,而是在外部范围内的某处声明。如您所见,gameInterval 没有在play 函数中声明,因此它不是play 的本地变量。不过可能是一个隐含的全局变量。
  • 如果 gameInterval 仅在函数范围内,则 let/var 在某处声明它。
  • 你没有在任何地方声明变量,所以它是在全局范围内自动定义的。
  • 由于缺少花括号,只有条件后面的第一行是它的一部分,如果存在则清除间隔,因此定义gameInterval的下一行总是运行,在全局作用域,所以在下次函数运行时设置
  • “变量 gameInterval 只在这个函数内部定义”我没有看到它在任何地方定义?

标签: javascript function conditional


【解决方案1】:

您没有在任何地方声明变量,因此它在全局范围内声明,因此 typeof != "undefined"

gameInterval = setInterval(gameLoop, 100);

总是被调用,因为它超出了 if 范围,这是它正常工作的方式

if(typeof a =="undefined"){
  var a=5;
  console.log('OK');
}

也尝试运行这个

function A(){
	a = 5;
}
A();

console.log(typeof a);

【讨论】:

    【解决方案2】:

    我假设您想将此与未定义的值进行比较? gameInterval !== undefined(无引号)可能是您正在寻找的。

    https://www.w3schools.com/Jsref/jsref_undefined.asp

    【讨论】:

    • typeof 总是返回一个字符串。字符串永远不会等于undefined“typeof 函数的结果永远不会给你一个等于“undefined”的字符串” 这是错误的。试试typeof undefined
    • 啊。说得通。谢谢你们!
    • 您能解释一下为什么使用 gameInterval !== undefined 而不是 typeof gameInterval != "undefined" 会有所不同吗?除了 OP 说他们的代码“有效”并且想知道为什么。你为什么提议改变一些东西?
    • 不是这样尝试在我的答案中运行代码sn-p
    【解决方案3】:

    由于您缺少 if 块周围的花括号,因此只有 if 之后的第一条语句有条件地执行。您的缩进混淆了这个问题。你真的在这样做:

    function play() {
        if (typeof gameInterval != "undefined") 
            clearInterval(gameInterval);
        gameInterval = setInterval(gameLoop, 100);
        allowPressKeys = true;
    }
    

    声明:

    gameInterval = setInterval(gameLoop, 100);
    

    总是被执行;

    你可能是这个意思:

    function play() {
        if (typeof gameInterval != "undefined") {
            clearInterval(gameInterval);
            gameInterval = setInterval(gameLoop, 100);
            allowPressKeys = true;
        }
    }
    

    【讨论】:

      【解决方案4】:

      条件满足时唯一发生的事情是:

      clearInterval(gameInterval);
      

      接下来的两行:

      gameInterval = setInterval(gameLoop, 100);
      allowPressKeys = true;
      

      总是被执行。

      这样格式化代码更容易理解:

      function play(){
          if (typeof gameInterval != "undefined") {
              clearInterval(gameInterval);
          }
          gameInterval = setInterval(gameLoop, 100);
          allowPressKeys = true;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 2018-06-27
        • 2021-07-24
        • 2023-03-07
        • 1970-01-01
        相关资源
        最近更新 更多