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

Private variable visible in console?

我有以下代码块:

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

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

您的代码正在成为 The Horror of Implicit Globals 的牺牲品:您从不声明 a,因此语句 a = 1; 创建了一个全局变量,而不是局部变量。 (在松散模式下。谢天谢地,如今我们有了 严格模式,在这种模式下,极其奇怪的行为被更改为错误,它本来应该是错误的。)

如果在a前面加一个var

var a = 1;

...它将是私有的,您将无法在控制台中访问它 除了 在该函数内的断点处暂停时。当您在函数内的断点处暂停时,函数范围内的所有内容都在控制台的范围内(以使控制台更有用)。

在松散模式下不小心创建全局变量真的很容易:

function foo() {
    var niftySpiffyThing;

    // ...

    niftySpiffything = 42;

    // ...
}

调用一次foo然后bam,你有一个名为niftySpiffything的全局变量(因为[=21=中的小写t ]).

这是习惯使用严格模式的众多原因之一,将 "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);
})();

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

a = 1 表示 a 是一个全局变量,它不是私有的。 写

var a = 1;

将其设为私有。

当您省略 var 时,您可以轻松创建全局变量 - 非常危险。

部分资料在这里:Difference between variable declaration syntaxes in Javascript (including global variables)?