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 一个值为"我的值"。
答案 0 :(得分:5)
因为所有变量声明都自动提升到其定义功能块的顶部,所以此代码为:
(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()
输出的内容并且已经定义,但尚未初始化,因此它显示为undefined
。
本地定义的myvar
覆盖/覆盖全局定义的一个,因此当您在函数中访问myvar
时,您只能获得本地定义的变量(无论它是否已初始化或不是)。
请参阅有关同一主题的其他参考资料:
How do JavaScript variables work?
JavaScript variable undefined vs not defined
One var per function in JavaScript?
如果删除函数中的var
(因此您只是引用变量,而不是声明一个新变量),那么您将只有一个名为myvar
的全局变量,并且您将得到看起来你可能期待的行为:
var myvar = "my value";
(function() {
console.log(myvar); // outputs "my value"
myvar = "local value";
})();
答案 1 :(得分:2)
这里你的函数是一个自调用函数。自动调用(启动)自调用表达式,而不调用。提升适用于变量声明和函数声明。
var myvar = "my value";
(function() {
console.log(myvar); // undefined
var myvar = "local value";
})();
所以这里函数甚至在用指定值
初始化myvar之前就调用了它