私有变量在控制台中可见?

时间:2015-01-09 12:10:47

标签: javascript console.log iife

我有以下代码块:

(function(){
  a = 1; 
  alert(a);
})();

当我在Chrome中打开控制台时,我可以看到变量a,其值为1。它不应该是隐形的,因为它在IIFE中吗?

enter image description here

2 个答案:

答案 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);
})();

然后你得到一个错误而不是全局错误。