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