javaScript——プリコンパイル
1767 ワード
jsはコードを実行する前にまだ2つのステップがあります.文法分析は名前の通りです.つまりエンジンがあなたのコードを確認します.プリコンパイルはメモリの中に空間を開けて変数と関数を保存します.注意すべきはプリコンパイルが関数実行前に発生します.
プリコンパイルの大体のプロセスは以下の通りです.
1.関数が動作する前の瞬間に、AO(Active Object)が実行されます.
2.パラメータを分析し、AOオブジェクトの属性名として、AOオブジェクトの属性値を参照します.
3.変数宣言を解析して、変数名を属性名として、値はundefinedです.同名の場合は、何も変更しません.
4.分析関数宣言、関数名は属性名、値は関数体として、同名の直接カバーがある場合.
上はfunction関数のプリコンパイルであり、同時に対応するグローバルスコープGO(Global Object)があります.GOには変数宣言と関数宣言がありません.プリコンパイルのプロセスは以下の通りです.
1.GOオブジェクトの作成
2.関数内のすべての変数宣言は全体的に向上し、値はundefinedです.
3.すべての関数は、全体の昇格を宣言します.値は関数体です.変数と関数名が同じなら、関数は変数の値を上書きすることを体得します.
上で実行期間の文脈に言及しましたが、実行期間の文脈と役割は何ですか?実行期間の文脈とは:関数が実行されると、実行期間の文脈の内部オブジェクトが作成され、定義された変数が記憶されています.実行期間の文脈は唯一無二です.関数が呼び出されるたびに、新しい実行期間の文脈が生まれます.関数の実行が完了すると、実行期間のコンテキストが破棄されます.
いくつかの例を挙げてみます.
また、変数宣言と関数宣言を区別して、例を挙げて次のようにします.
プリコンパイルの大体のプロセスは以下の通りです.
1.関数が動作する前の瞬間に、AO(Active Object)が実行されます.
2.パラメータを分析し、AOオブジェクトの属性名として、AOオブジェクトの属性値を参照します.
3.変数宣言を解析して、変数名を属性名として、値はundefinedです.同名の場合は、何も変更しません.
4.分析関数宣言、関数名は属性名、値は関数体として、同名の直接カバーがある場合.
上はfunction関数のプリコンパイルであり、同時に対応するグローバルスコープGO(Global Object)があります.GOには変数宣言と関数宣言がありません.プリコンパイルのプロセスは以下の通りです.
1.GOオブジェクトの作成
2.関数内のすべての変数宣言は全体的に向上し、値はundefinedです.
3.すべての関数は、全体の昇格を宣言します.値は関数体です.変数と関数名が同じなら、関数は変数の値を上書きすることを体得します.
上で実行期間の文脈に言及しましたが、実行期間の文脈と役割は何ですか?実行期間の文脈とは:関数が実行されると、実行期間の文脈の内部オブジェクトが作成され、定義された変数が記憶されています.実行期間の文脈は唯一無二です.関数が呼び出されるたびに、新しい実行期間の文脈が生まれます.関数の実行が完了すると、実行期間のコンテキストが破棄されます.
いくつかの例を挙げてみます.
a = 100;
function demo(e){
function e(){};
arguments[0] = 2;
console,log(e);
if(a){
var b = 123;
function c(){
}
}
var c;
a = 10;
var a;
console.log(b);
f = 123;
console.log(c);
console,log(a);
}
var a;
demo(1);
console.log(a);
console.log(f);
まず大域作用ドメインGOを分析します.GO={
a : undefined
demo : function
f : undefined
}
GO分析完了実行開始GO={
a : 100
demo : function
f : 123
}
関数の呼び出しが開始されると、AOが形成されます.demo.AO = {
e : function,
b : undefined,
c : function,
a : undefined,
}
分析が完了し、実行を開始します.demo.AO = {
e : 2,
b : undefined,
c : function,
a : 10,
}
一回の対応出力は2 undefined undefined 10 100 123です.また、変数宣言と関数宣言を区別して、例を挙げて次のようにします.
var a = 10 //
function b(){} //
var demo = function c(){} //
転載先:https://www.cnblogs.com/jrrrrr/p/9297693.html