Javascript「プリコンパイル」理解

4754 ワード

まず一例を見てみます.
<script type="text/javascript">
    var a = 1;
    function show() {
       console.log(a + 1);
       var a = 2;
       console.log(a + 1);
    }
    show();
script>
      その出力結果はNaN,3
      なぜ最初に印刷した結果は2ではなくNaNですか?
      実際、JSの解析過程は二つの段階に分けられています.
      事前に翻訳すると、JSは本コードブロック内のすべての声明のvar変数と関数を処理します.変数はundefinedに初期化され、関数はプリコンパイル時に解析されます.      注:Scriptタグはコードブロックです.
      上のコードの実行過程は以下の通りです.
      1.第一歩グローバルvarキーワードをスキャンする:
var a;  //  a     ,     undefined
      関数式であれば、var b=function(){}のようにbもundefinedに初期化され、等号の右の関数はbに値が与えられず、解析されない.
      2.第二ステップはfunctionをスキャンして、関数が解析される過程は以下の通りです.
function show() {
    var a;                 //    a     undefined
    console.log(a + 1);    //          a,  undefined,     a       
    a = 2;                 //    a    2
    console.log(a + 1);    //2+1
}
      3.第3ステップは、コードを順次実行します.最終的には以下の通りです.
var a;                     //    a,     undefined
function show() {
    var a;                 //    a     undefined
    console.log(a + 1);    //   a        ,  undefined
    a = 2;                 //    a    2
    console.log(a + 1);    //2+1
}
a = 1;                     //    a,    1,        a  
show();                    //  show  
      undefinedとnumberが演算する場合、undefinedはnumberタイプではないので、undefinedはNaNに変換され、NaNとnumber演算する場合、結果はNaNとなります.したがって、最初の印刷結果はNaNで、2番目の印刷結果は3です.
      ショウ関数に変数aが宣言されていない場合、ショー関数のaは作用領域に沿って上に検索されます.この時、aはグローバル変数です.例は以下の通りです.
var a = 1;
function show(){
    console.log(a + 1);
}
show();
      そのプリコンパイルは次の通りです.
var a;                   //a     ,   undefined
function show(){
    console.log(a + 1);  //      a,  undefined
}
      順序で実行する場合
a = 1;    //--    a    ,    1, show         a   1.
show();   //--  console.log(a + 1),   a    1
      ですから、プリントした結果は2です.
      まとめてください.JSは実行前に同様の「プリコンパイル」を行います.変数をあらかじめ定義してから関数を定義します.宣言の変数であれ、宣言式関数であれ、実行時にはプリコンパイル期間の値を上書きすることができます.このプロセスは文法エラーが発見されたら、前解析は終了します.