8

对于这个片段,我对全局变量“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?

​</p>

4

6 回答 6

11

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

于 2012-07-09T14:32:46.977 回答
2

所以,这里有两件事:提升阴影

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

var a = 10;

function func(){
    var a;
    a = 5;
    a = 23;
}

而且因为第二个,你a用一个局部变量“遮蔽”了全局变量,所以这些变化不会反映到全局变量中a

于 2012-07-09T14:43:29.077 回答
1

这称为“变量提升”。 var声明(和function()声明)被移到其作用域的顶部。

于 2012-07-09T14:33:14.200 回答
0

这与吊装有关。

在函数中,声明了一个同名的局部变量。即使它发生在你的修改之后,它也被认为是在它之前声明的——这被称为提升。

局部变量提升声明而不是值。所以:

function someFunc() {
    alert(localVar); //undefined
    var localVar = 5;
}

函数,如果用function name() {...语法声明,声明和值都会提升。

function someFunc() {
    alert(someInnerFunc()); //5
    function someInnerFunc() { return 5; }
}
于 2012-07-09T14:32:54.243 回答
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
于 2012-07-09T14:33:13.437 回答
0

据推测,该语句为整个范围var a = 23创建了一个局部变量。所以全局被遮蔽了整个的,而不仅仅是语句下面的行。所以在你的第二个片段中,分配给下面声明的局部变量。afunc()a = 5

于 2012-07-09T14:33:30.970 回答