不应该是未初始化的var总是未定义的类型

时间:2014-12-02 21:46:44

标签: javascript node.js initialization standards scope

我遇到了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
    }
}

使用节点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运行toRun设置为undefined吗?

node -v
v0.10.33

2 个答案:

答案 0 :(得分:2)

只有函数在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。请注意,声明已提升,但不是初始化。

答案 1 :(得分:0)

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

你真的正确地检查'undefined'和typeof一样。 typeof总是返回字符串。因此typeof是'undefined',在这种情况下浏览器不会记录。

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