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' が 5 ではなく 10 と評価されるのはなぜでしょうか? それはあたかも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.adequatygood.com/2010/2/JavaScript-Scoping-and-Hoisting

于 2012-07-09T14:32:46.977 に答える
2

つまり、ここではホイストシャドウイングの 2 つが行われています。

最初のものは、変数宣言が一番上に「持ち上げられる」ため、コードは次のようになります。

var a = 10;

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

また、2 つ目はa、ローカル変数でグローバル変数を「シャドウ」しているため、変更は global に反映されません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のローカル変数を作成します。したがって、グローバルは、ステートメントの下の行だけでなく、全体に対してシャドウ化されます。したがって、2 番目のスニペットでは、以下で宣言されているローカル変数に代入しています。afunc()a = 5

于 2012-07-09T14:33:30.970 に答える