ECMAScript Hoistingと「鶏が先か卵が先か」
2361 ワード
コードは簡単ですが、面白いものがあります.
私たちはすべて知っています.JavaScriptコードは上から下へ、プログレッシブ解釈で実行されます.
まずこのコードを見ます.
このコードを見てください.
この二つのコードは一つの問題を述べています.鶏肉が先ですか?それとも卵が先ですか?
JavaScript言語で質問すると、先に声明があります. ),それとも先に赋価がありますか?
--------------------------------------------------------------------------------
JavaScriptにとっては、先に声明があります.
どのように「先に声明がある」と理解しますか?
JavaScriptコードは実行前にコンパイルされます.コンパイルの一部は変数と関数の声明です.
上記の2つの例については、以下のように説明することができる.
第1のセグメントコードは、実行順序に従って、このように理解され得る.
ステップ1:
第二のセグメントコードについては、このように理解することができる.
ステップ1:
上のプロセスはJavaScript声明のアップグレードです.アップグレードとは、下の位置から上の階の位置までです.
--------------------------------------------------------------------------------
Hoistingのいくつかのポイント:
アップグレードされたのは声明であり、実行可能なコードセグメントはアップグレードされません. アップグレードは、スコープによって向上される.すなわち、ステートメントは、そのスコープの一番上にしか引き上げられない.例: 関数宣言(Function delation)は向上しますが、関数式(Function expression)は向上しません.例:
参考:
JavaScript Hoisting
--------------------------------------------------------------------------------
私たちはすべて知っています.JavaScriptコードは上から下へ、プログレッシブ解釈で実行されます.
まずこのコードを見ます.
a = 2;
var a;
console.log( a );
コンソールからは何が出力されますか?undefined
を出力したと感じるかもしれません. ,a定義ステートメントは、a=2のこの割当ステートメントの後であるため、consolie.log(a)の時、aは割当てられていないので、undefined
である. .しかし事実はそうではない.出力は:2ですこのコードを見てください.
console.log( a );
var a = 2;
上記の例を通して、出力2か、それともReferenceError
を投げると感じるかもしれません. 違います.この二つの考えは全部間違っています.出力はundefined
です . この二つのコードは一つの問題を述べています.鶏肉が先ですか?それとも卵が先ですか?
JavaScript言語で質問すると、先に声明があります. ),それとも先に赋価がありますか?
--------------------------------------------------------------------------------
JavaScriptにとっては、先に声明があります.
どのように「先に声明がある」と理解しますか?
JavaScriptコードは実行前にコンパイルされます.コンパイルの一部は変数と関数の声明です.
上記の2つの例については、以下のように説明することができる.
第1のセグメントコードは、実行順序に従って、このように理解され得る.
ステップ1:
var a;
ステップ2:a = 2;
console.log(a);
第二のセグメントコードについては、このように理解することができる.
ステップ1:
var a;
ステップ2:console.log(a)// undefined
a =2 ;
上のプロセスはJavaScript声明のアップグレードです.アップグレードとは、下の位置から上の階の位置までです.
--------------------------------------------------------------------------------
Hoistingのいくつかのポイント:
foo();
function foo() {
console.log( a ); // undefined
var a = 2;
}
このコードの実行過程は実はこのようなものです. function foo() {
var a;
console.log( a ); // undefined
a = 2;
}
foo();
参考:
JavaScript Hoisting
--------------------------------------------------------------------------------