【问题标题】:Shouldn't an uninitialised var always be of type undefined未初始化的变量不应该总是未定义类型吗
【发布时间】:2014-12-02 21:46:44
【问题描述】:

我遇到了一个案例,var 的行为与直觉相反。

这是一个例子:

for (var i = 0; i < 10; i++) {
    var toRun;

    if(i%2 !== 0) {
        toRun = {number:i};
    }

    console.log("toRun is", toRun);

    if ('undefined' != typeof toRun && 'undefined' != typeof toRun.number)
    {
        //Do something
    }
}

用node js运行的结果是:

toRun is undefined
toRun is { number: 1 }
toRun is { number: 1 }
toRun is { number: 3 }
toRun is { number: 3 }
toRun is { number: 5 }
toRun is { number: 5 }
toRun is { number: 7 }
toRun is { number: 7 }
toRun is { number: 9 }

我期待:

toRun is undefined
toRun is { number: 1 }
toRun is undefined
toRun is { number: 3 }
toRun is undefined
toRun is { number: 5 }
toRun is undefined
toRun is { number: 7 }
toRun is undefined
toRun is { number: 9 }

这是 javascript 中的正常行为吗?

不应该在每次执行循环中的代码时将var toRun 设置为undefined 吗?

node -v
v0.10.33

【问题讨论】:

  • var 语句被提升;作业不是。例如,如果你写 var toRun = undefined; 而不仅仅是 var toRun;,你会得到你想要的。
  • @raina77ow :感谢您为我指明了正确的方向。我不知道 js 会将变量的初始化移动到当前函数的开头,我希望它在块级别这样做。您应该将此作为答案发布以正确关闭此问题。

标签: javascript node.js initialization standards scope


【解决方案1】:

只有函数才能在 JavaScript 中创建新范围。变量声明被提升到最内层函数的顶部。

function one() {
  var a;
  console.log(a);
  a = 1;
}

function two() {
  console.log(a);
  var a = 1;
}

function three() {
  console.log(a);
  for(var i = 0;i < 10;i++) {
    var a;
  }
}

这三个函数具有相同的行为——它们打印undefined。请注意,声明是提升的,而不是初始化。

【讨论】:

    【解决方案2】:

    是的,它们是 javascript 的正常行为。您告诉浏览器仅在未定义时才记录。

    而且您确实在使用 typeof 检查“未定义”的正确方法。 typeof 总是返回字符串。所以 typeof 是 'undefined' 并且在这种情况下浏览器不会记录。

    如果你在不检查的情况下运行代码,那么只有你会看到 toRun 的未定义值。

    【讨论】:

    • 问题不在于检查 typeof,而在于理解为什么每次执行代码时 var 都没有初始化为 undefined。 @raina77ow 指出了正确的原因。
    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多