私有变量在控制台中可见吗?
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)?
我有以下代码块:
(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)?