了解Javascript范围和变量

时间:2015-12-19 20:33:28

标签: javascript

我已经开始实际探索并尝试深入理解Javascript。在我的旅程中,我提出了以下代码,并且我对输出感到不安,特别是因为我似乎无法解释其输出,但它没有抛出任何错误:

var test = 1;
var func = function(){
    console.log(test);
    for(x=0;x!=1;x++) {
        var test = test + x;
        console.log(test);
    };
};
console.log(test);
func();

我希望输出为:

1
1
1   (or possibly an error due to scoping issues)

我实际得到的是:

1
undefined
NaN

我可以购买NaN,因为在我看来,我已经在本地确定了一个名为test的变量,并且我将它初始化为自己加x。我可以看到这是一个明显的失败,但没有错误被抛出。真正困扰我的是#34; undefined。"不应该输出全局范围的test

2 个答案:

答案 0 :(得分:4)

Javascript是功能范围,而不是块范围。此外,var test = 1; var func = function(){ var test; console.log(test); for(x=0;x!=1;x++) { test = test + x; console.log(test); }; }; console.log(test); func(); 声明提升到函数定义的顶部。所以你的代码等同于:

git reset --hard

这就是为什么有些人(例如jslint的作者Doug Crockford)主张将声明放在函数的顶部,因为这就是解释器如何读取它们的原因。

答案 1 :(得分:1)

我还没有足够的声誉发表评论,我打算评论托马斯的回答。我同意Thomas的意见,但我想补充一点i关键字已添加到javascript in ES6。这允许变量的块级别范围。这是链接的一个例子。在以下代码中,变量for (let i = 0; i<10; i++) { console.log(i); // 0, 1, 2, 3, 4 ... 9 } console.log(i); // i is not defined 仅在for循环的范围内。

{{1}}