我已经开始实际探索并尝试深入理解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
?
答案 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}}