ECMAScript Hoistingと「鶏が先か卵が先か」

2361 ワード

コードは簡単ですが、面白いものがあります.
 
私たちはすべて知っています.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 delation)は向上しますが、関数式(Function expression)は向上しません.例:
    function foo() {
        var a;
    
        console.log( a ); // undefined
    
        a = 2;
    }
    
    foo();
     
  •  
    参考:
    JavaScript Hoisting
     
     
     
     
     
     
     
     
     
     
    --------------------------------------------------------------------------------