Javascript:不使用var关键字时的两个输出

时间:2016-11-05 11:31:31

标签: javascript

Google Chrome和Firebug通过此示例为我提供了两种不同的输出。

如果b变得全局化,那么首先应该给我未定义和第二个14.对吗?但是在萤火虫中,它会产生两个14,Chrome会提供参考错误。

function a() {
      b = 14;
}
console.log(b);
a();
console.log(b);

2 个答案:

答案 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中的一个错误。