我有以下代码块:
(function(){
a = 1;
alert(a);
})();
当我在Chrome中打开控制台时,我可以看到变量a
,其值为1
。它不应该是隐形的,因为它在IIFE中吗?
答案 0 :(得分:3)
a = 1
表示a是全局变量,它不是私有的。
写
var a = 1;
将其设为私有。
省略var
时,可以轻松创建全局变量 - 非常危险。
有些材料在这里:Difference between variable declaration syntaxes in Javascript (including global variables)?
答案 1 :(得分:2)
您的代码正在成为The Horror of Implicit Globals的牺牲品:您永远不会声明a
,因此语句a = 1;
会创建一个全局变量,而不是本地变量。 (在松散模式下。幸运的是,现在我们有严格模式,其中极其奇怪的行为被改变为它应该一直存在的错误。)
如果您在var
前面添加a
:
var a = 1;
...它将是私有的,当在该函数中的断点处暂停时,您将无法在控制台中访问它,除了。当您在函数内的断点处暂停时,函数范围内的所有内容都在控制台的范围内(以使控制台更有用)。
在松散模式下意外创建全局变量非常容易:
function foo() {
var niftySpiffyThing;
// ...
niftySpiffything = 42;
// ...
}
拨打foo
一次并 bam ,您有一个名为niftySpiffything
的全局(因为t
中的小写thing
)。
这是习惯使用严格模式的众多原因之一,将"use strict"
放在脚本的顶部或作为函数中的第一个表达式:
"use strict"; // Applies to all code in this script
(function(){
a = 1;
alert(a);
})();
或
(function(){
"use strict"; // Applies only to code within this function
a = 1;
alert(a);
})();
然后你得到一个错误而不是全局错误。