2016-03-21 12 views
0

単純な関数宣言をコーディングするとき、FirefoxのScratchpadでは奇妙な動作があります。私が実行して、コードの上に最初に実行されると、それは以下のように結果が得られたページがリロードされるときに変数の値が変更される

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

しかしときに、私はそれをもう一度実行不定不定、以下の結果が得られました:

0未定義

だから私は、キャッシュに保存された値なければならないことを想定したが、その後、なぜ未定義まだ変数yませんでしたか?

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

答えて

1

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

初めてコードを実行すると、コードは実際にはこのようになります。あなたが二度目を再実行するとき、それはそうセカンドランJavaScriptで

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

func のブロックスコープを再定義として

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(); 

は今、func()の状態は、変更するつもりはありません呼び出されたすべての関数は、新しい実行コンテキストを作成します。

ただし、最初はvar x; declared and defined in global scopeそれはそこから取り出されます。 so、x=0 and y=undefined

0

最初にその時刻を実行すると、それを使用する前にxとy変数が宣言されていません。 2番目の行になると、xはページスクリプトに残っているグローバルとして宣言されます。 y変数の場合は関数内で宣言され、そのスコープは関数のみに制限されるため、yはグローバルにはなりません。

したがって、時間x変数はそのグローバル値を取得しますが、yの場合はページをリフレッシュしません。 Javascriptの変数のすべての範囲について

関連する問題