javascript acivation objectとvariable ojectとプリコンパイル
3121 ワード
一、実行コンテキスト ECMAScriptコードが実行されると、それは常に一定のコンテキストで実行され、実行文脈はやや抽象的なエンティティであり、作用領域と変数の実例化がどのように動作するかを理解するのに役立つ.3つのタイプの実行可能なコードには、それぞれ実行されるコンテキストがあります.関数が実行されると、制御は、関数コードの実行コンテキストに入るということができます.グローバルコード実行時は、グローバルコード(Global code)の実行コンテキストに入ります. あなたが見ているように、スタックからコンテキスト論理を実行します.まず、自分のスコープのグローバルコードがあるかもしれません.コードの中で関数を呼び出すことができます.自分のスコープがあります.関数は他の関数を呼び出すことができます.関数が再帰的に自身を呼び出しても、呼び出しごとに新しい実行コンテキストに入ります. Activation object(活性化対象)/Varable oject(変数対象) 各実行文脈はその内部にVarable Objectがある.実行文脈と同様に、Varable objectは変数の実装を記述する抽象的なエンティティである.面白いことに、コードで宣言された変数と関数は、実際にこの変数オブジェクトの属性として追加されます. グローバルコードの実行コンテキストに入ると、グローバルオブジェクトが変数オブジェクトとして使用されます.これは、大域的に宣言された変数や関数が、大域的なオブジェクトの属性になる理由です.
コードは以下の通りです
コードは以下の通りです
コードは以下の通りです
Javascriptは<script>の段の方式によってプリコンパイルして関連コードの段を処理して、しかも先に変数を定義して、更に事前に関数を定義する方式でプリコンパイルします.また、変数/関数がセグメント内の任意の場所で明示的に宣言されても、すべてのコードが実行される前にプリコンパイルされ、変数の値は最初はundefinedであり、関数変数の初期値は関数であり、次に例示的なコードを使用して、全体のプリコンパイル状況を説明します.
コードは以下の通りです
/* remember that `this` refers to global object when in global scope */
var GLOBAL_OBJECT = this;
var foo = 1;
GLOBAL_OBJECT.foo; // 1
foo === GLOBAL_OBJECT.foo; // true
function bar(){}
typeof GLOBAL_OBJECT.bar; // "function"
GLOBAL_OBJECT.bar === bar; // true
グローバル変数はグローバルオブジェクトの属性になりますが、関数コードで定義されているローカル変数はどうなりますか?行動は似ています.変数のオブジェクトの属性になります.唯一の違いは、関数コードにおいて、変数オブジェクトはグローバルオブジェクトではなく、いわゆるアクティブオブジェクトです.関数コードが実行スコープに入るたびに、アクティブオブジェクトが作成されます. 関数コード中の変数と関数がアクティブオブジェクトの属性となるだけでなく、関数の各パラメータ(参照に対応する名前)と特定のAgmentsオブジェクトも同じです.なお、オブジェクトの活性化は、プログラムコードによって本当にアクセスされない内部メカニズムである. コードは以下の通りです
(function(foo){
var bar = 2;
function baz(){}
/*
In abstract terms,
Special `arguments` object becomes a property of containing function's Activation object:
ACTIVATION_OBJECT.arguments; // Arguments object
...as well as argument `foo`:
ACTIVATION_OBJECT.foo; // 1
...as well as variable `bar`:
ACTIVATION_OBJECT.bar; // 2
...as well as function declared locally:
typeof ACTIVATION_OBJECT.baz; // "function"
*/
})(1);
最後に、Evaalコードで宣言された変数を呼び出し中のコンテキストの変数オブジェクトの属性として作成します.Evalコードは、呼び出されているコンテキストを実行する変数オブジェクトのみを使用します. コードは以下の通りです
var GLOBAL_OBJECT = this;
/* `foo` is created as a property of calling context Variable object,
which in this case is a Global object */
eval('var foo = 1;');
GLOBAL_OBJECT.foo; // 1
(function(){
/* `bar` is created as a property of calling context Variable object,
which in this case is an Activation object of containing function */
eval('var bar = 1;');
/*
In abstract terms,
ACTIVATION_OBJECT.bar; // 1
*/
})();
二「プリコンパイル」Javascriptは<script>の段の方式によってプリコンパイルして関連コードの段を処理して、しかも先に変数を定義して、更に事前に関数を定義する方式でプリコンパイルします.また、変数/関数がセグメント内の任意の場所で明示的に宣言されても、すべてのコードが実行される前にプリコンパイルされ、変数の値は最初はundefinedであり、関数変数の初期値は関数であり、次に例示的なコードを使用して、全体のプリコンパイル状況を説明します.
alert(f);//function f(){ return1;}
alert(b);//undefined
alert(a);//undefined
var a = function (){
return 2;
}
function f (){ /
return 1;
};
var b = 10;
上書き:下記の順序で、var aはundefinedにプリコンパイルされ、aは「functionna(){return 1]」にプリコンパイルされ、aは「functiona(){return 10]」にプリコンパイルされます. alert(a);//function a (){return 10;};
function a (){
return 1;
};
function a (){
return 10;
};
var a = 123;