Javascript「プリコンパイル」理解
4754 ワード
まず一例を見てみます.
なぜ最初に印刷した結果は2ではなくNaNですか?
実際、JSの解析過程は二つの段階に分けられています.
事前に翻訳すると、JSは本コードブロック内のすべての声明のvar変数と関数を処理します.変数はundefinedに初期化され、関数はプリコンパイル時に解析されます. 注:Scriptタグはコードブロックです.
上のコードの実行過程は以下の通りです.
1.第一歩グローバルvarキーワードをスキャンする:
2.第二ステップはfunctionをスキャンして、関数が解析される過程は以下の通りです.
ショウ関数に変数aが宣言されていない場合、ショー関数のaは作用領域に沿って上に検索されます.この時、aはグローバル変数です.例は以下の通りです.
まとめてください.JSは実行前に同様の「プリコンパイル」を行います.変数をあらかじめ定義してから関数を定義します.宣言の変数であれ、宣言式関数であれ、実行時にはプリコンパイル期間の値を上書きすることができます.このプロセスは文法エラーが発見されたら、前解析は終了します.
<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は実行前に同様の「プリコンパイル」を行います.変数をあらかじめ定義してから関数を定義します.宣言の変数であれ、宣言式関数であれ、実行時にはプリコンパイル期間の値を上書きすることができます.このプロセスは文法エラーが発見されたら、前解析は終了します.