这个JavaScript代码片段令人困惑

时间:2012-07-09 14:30:29

标签: javascript

对于这个片段,我并不感到惊讶全局变量'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?

6 个答案:

答案 0 :(得分:11)

这是由于变量提升:使用var关键字定义的任何内容都会被“提升”到当前范围的顶部,从而创建一个本地变量a。请参阅:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

答案 1 :(得分:2)

所以,这里有两件事:hoistingshadowing

因为第一个,变量声明被“提升”到顶部,所以你的代码相当于:

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将分配给下面声明的局部变量。