JavaScript 指南中有一句话是关于变量作用域的:“JavaScript 中的变量在某种意义上被“提升”或提升到函数或语句的顶部。但是,尚未初始化的变量将返回值不明确的。”
/**
* Example 2
*/
// will return a value of undefined
var myvar = "my value";
(function() {
console.log(myvar); // undefined
var myvar = "local value";
})();
我的问题是:为什么“console.log(myvar);”会返回 undefined?我认为第一行已将 myvar 初始化为“我的值”的值。
因为所有变量声明都自动提升到它们定义函数 block 的顶部,所以这段代码:
(function() {
console.log(myvar); // undefined
var myvar = "local value";
})();
实际上是这样给 JS 解释器的:
(function() {
var myvar; // declares a new local variable that covers up the global name
console.log(myvar); // undefined
myvar = "local value";
})();
这应该向您展示为什么本地定义的 myvar
是 console.log()
输出的内容,并且它已被定义,但尚未初始化,因此显示为 未定义
。
本地定义的 myvar
覆盖/覆盖了全局定义的,因此当您在函数中访问 myvar
时,您只会获得本地定义的变量(无论是否已初始化)还没有)。
查看关于同一主题的其他引用资料:
How do JavaScript variables work?
JavaScript variable undefined vs not defined
One var per function in JavaScript?
JavaScript 'hoisting'
如果您在函数中删除 var
(这样您只是引用一个变量,而不是声明一个新变量),那么您将只有一个名为 myvar
你会得到你可能期望的行为:
var myvar = "my value";
(function() {
console.log(myvar); // outputs "my value"
myvar = "local value";
})();