对于这个片段,我并不感到惊讶全局变量'a'的评估结果是5。
http://jsfiddle.net/MeiJsVa23/gZSxY/:
var a = 10;
function func(){
a = 5;
}
func(); // expect global variable 'a' to be modified to 5;
alert(a); // and this prints out 5 as expected. No surprise here.
但是为什么这个代码片段,全局变量'a'的评估值是10而不是5?好像a = 5
从未发生过。
http://jsfiddle.net/MeiJsVa23/2WZ7w/:
var a = 10;
function func(){
a = 5;
var a = 23;
}
func(); // expect global variable 'a' to be modified to 5;
alert(a); // but this prints out 10!! why?
答案 0 :(得分:11)
这是由于变量提升:使用var
关键字定义的任何内容都会被“提升”到当前范围的顶部,从而创建一个本地变量a
。请参阅:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
答案 1 :(得分:2)
因为第一个,变量声明被“提升”到顶部,所以你的代码相当于:
var a = 10;
function func(){
var a;
a = 5;
a = 23;
}
而且因为第二个,你用全局变量“{遮蔽”了全局变量a
,因此这些变化不会反映到全局a
。
答案 2 :(得分:1)
这称为“variable hoisting”。 var
声明(和function()
声明)被移到其范围的顶部。
答案 3 :(得分:0)
这与提升。
有关在函数中,声明了具有相同名称的局部变量。即使它在你修改之后发生,它也被认为是在它之前被宣布 - 这被称为吊装。
局部变量提升声明但不是值。所以:
function someFunc() {
alert(localVar); //undefined
var localVar = 5;
}
如果使用function name() {...
语法声明函数,则声明和值都会提升。
function someFunc() {
alert(someInnerFunc()); //5
function someInnerFunc() { return 5; }
}
答案 4 :(得分:0)
var a = 10; //a is 10
function func(){
a = 5; //a is 5
var a = 23; // a is now in local scope (via hoisting) and is 23
}
func();
alert(a); // prints global a = 10
答案 5 :(得分:0)
据推测,语句var a = 23
为整个范围创建了一个局部变量 。因此全局a
的全局func()
被遮蔽,而不仅仅是语句下方的行。因此,在您的第二个代码段中,a = 5
将分配给下面声明的局部变量。