不应该有一个未初始化的变量var undefined
问题描述:
我遇到过这种情况,其中var
的行为与直觉相反。与节点JS运行时,不应该有一个未初始化的变量var undefined
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
}
}
结果:
下面是一个例子
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
答
只有函数在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
。请注意,该声明已被提升,但不是初始化。
答
是的,它们是javascript的正常行为。只有当它未定义时,您才告诉浏览器才能记录日志。
你真的正在用typeof检查'undefined'的正确方法。 typeof总是返回字符串。所以typeof是'未定义',在这种情况下浏览器不会记录。
如果你没有检查就运行代码,那么只有你会看到toRun的undefined vlaue。
+0
这个问题不是关于检查typeof,而是关于理解var每次执行代码时为什么var未初始化为未定义的原因。 @ raina77ow指出了正确的理由。 – Coyote 2014-12-02 22:38:25
'var'语句被挂起;任务不是。例如,如果您编写'var toRun = undefined;',而不是仅仅使用'var toRun;',您将得到您想要的内容。 – raina77ow 2014-12-02 21:50:48
@ raina77ow:\t 谢谢你指点我正确的方向。我不知道js会将变量的初始化移动到当前函数的开始,我期待它在块级别上这样做。您应该将此作为解决此问题的答案妥善关闭。 – Coyote 2014-12-02 22:52:20