我遇到了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
答案 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的未定义值。