2014-12-02 39 views
0

我遇到过这种情况,其中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设置toRunundefined每次执行循环中的代码?

node -v 
v0.10.33 
+0

'var'语句被挂起;任务不是。例如,如果您编写'var toRun = undefined;',而不是仅仅使用'var toRun;',您将得到您想要的内容。 – raina77ow 2014-12-02 21:50:48

+0

@ raina77ow:\t 谢谢你指点我正确的方向。我不知道js会将变量的初始化移动到当前函数的开始,我期待它在块级别上这样做。您应该将此作为解决此问题的答案妥善关闭。 – Coyote 2014-12-02 22:52:20

回答

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。请注意,该声明已被提升,但不是初始化。

0

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

你真的正在用typeof检查'undefined'的正确方法。 typeof总是返回字符串。所以typeof是'未定义',在这种情况下浏览器不会记录。

如果你没有检查就运行代码,那么只有你会看到toRun的undefined vlaue。

+0

这个问题不是关于检查typeof,而是关于理解var每次执行代码时为什么var未初始化为未定义的原因。 @ raina77ow指出了正确的理由。 – Coyote 2014-12-02 22:38:25