0

単純な関数宣言のコーディング中に、Firefox Scratchpad で奇妙な動作が発生します。

console.log(x);
var x = 0;
var func = function() {
  console.log(y);
  var y = 1;
};
func();

上記のコードを Run で初めて実行すると、次のような結果が得られました。

未定義未定義

しかし、2回目に実行すると、以下の結果が得られました:

0 未定義

したがって、値をキャッシュに保存する必要があると想定しましたが、変数 y がまだ未定義ではないのはなぜですか?

また、Reload と Run で繰り返したところ、最初の結果が繰り返されました。

4

2 に答える 2

1

そのすべてがvar top-hoistingです。関数のブロックスコープ

初めて実行すると、コードは実際には次のようになります。

var x;
console.log(x); // undefined as  still x is not defined
x = 0;
var func = function() {
   var y;
  console.log(y); //undefined as still y is not defined
  y = 1;
};
func();

これで、2 回目に再実行しても、2 回目の実行で Soのブロック スコープが再定義されたため、 のステータスはfunc()変わりません。func

var func = function() {
   var y;
  console.log(y); //undefined as still y is not defined 
                  //as scope is re-initializd 
  y = 1;
};

javascriptでは、すべての関数が呼び出されると、新しい実行コンテキストを作成します

しかし、var x; declared and defined in global scope初回実行時と同様に、そこからフェッチされます。それで、x=0 and y=undefined

于 2016-03-21T07:29:10.893 に答える