JavaScriptプリコンパイル(変数アップと関数アップの原理)

5825 ワード

本文の内容はhttps://www.cnblogs.com/CBDoctor/p/3745246.html
1.変数の昇格
 1 console.log(global); // undefined
 2 var global = 'global';
 3 console.log(global); // global
 4  
 5 function fn () {
 6   console.log(a); // undefined
 7   var a = 'aaa';
 8   console.log(a); // aaa
 9 }
10 fn();
疑問一:
aとglobalはまだ定義されていません.どうしてundefinedになりましたか?
 
2.関数アップ
1 console.log(f1); // function f1() {}   
2 console.log(f2); // undefined  
3 function f1() {}
4 var f2 = function() {}
疑問二:
consolie.log(f 1)は、なぜ初期化されていないf 1関数を出力することができますか?
疑問三:
疑問のように、なぜf 2が定義されていないのにundefinedを出力しますか?
 
これらの疑問の答えは、JSのプリコンパイルメカニズムから来ています.
 
3.プリコンパイル
JSは完全にコード順で解析実行するのではなく、解析前に「プリコンパイル」を行います.この過程で、
(1)定義式の関数は優先的に実行されます.
(2)すべてのvar変数定義、デフォルト値はundefinedです.
これは上の二つのコードの出力の原因を説明しました.上の二つのコードは下記の形式で理解できます.
変数の昇格:
 1 var global;
 2 console.log(global); // undefined
 3 global = 'global';
 4 console.log(global); // global
 5  
 6 function fn () {
 7       var a;
 8   console.log(a); // undefined
 9   a = 'aaa';
10   console.log(a); // aaa
11 }
12 fn();
関数の昇格:
1 function f1() {}
2 var f2;
3 console.log(f1); 
4 console.log(f2); 
5 f2 = function() {}
 
4.間違いやすい点
 1 //     ,   1
 2 f();                                 
 3 function f(){
 4     alert(1);
 5 }
 6 
 7 //     ,      。
 8 f();                                 
 9 var f = function(){
10     alert(1);
11 }
これは一見して分かりますが、プリコンパイル段階で変数fを宣言しました.直接呼び出しは間違いありません.
 
5.まとめ
  JSローディングはプリコンパイルと実行の二つの段階を含む.コンパイル段階では、すべてのvar変数とfunctionをスキャンし、var変数をundefinedタイプに初期化しますが、functionは関数値に初期化されます.
  実行段階になると、JSは上から下へ順番に実行します.var変数に遭遇すると、割り当てが行われる前に呼び出すとエラーが発生します.関数変数に出会うと、アクティブなオブジェクトから関数を探します.