Google Chrome和Firebug通过此示例为我提供了两种不同的输出。
如果b变得全局化,那么首先应该给我未定义和第二个14.对吗?但是在萤火虫中,它会产生两个14,Chrome会提供参考错误。
function a() {
b = 14;
}
console.log(b);
a();
console.log(b);
答案 0 :(得分:6)
请勿使用浏览器控制台进行示波器实验。不同的浏览器控制台以不同的方式运行您的代码。
如果您在正常环境中完全按照引用的方式运行该代码,那么正确的事情是您将从第一个ReferenceError
行获得console.log(b)
:
function a() {
b = 14;
}
console.log(b); // ReferenceError
a();
console.log(b);
即使在宽松模式下,尝试读取未声明标识符的值为ReferenceError
。
如果我们删除该初始console.log
,我们会在一个因松散与严格模式而变化的区域内:
// In loose mode
function a() {
b = 14;
}
a();
console.log(b); // 14
隐含全局的恐怖; 1 在松散模式下,分配到未声明的标识符会创建一个全局变量。
Vs以上。
// In strict mode
"use strict";
function a() {
b = 14; // ReferenceError
}
a();
console.log(b);
......应该如何。
1 这是我贫血的小博客上的一篇文章。
答案 1 :(得分:3)
第一个console.log()
应该给出ReferenceError,因为那时没有定义变量。如果它在Firebug中表现不同,那么它就是Firebug中的一个错误。