javascript作用ドメインチェーンに対する理解
4474 ワード
この数日間はjavascriptの機能ドメインチェーンを勉強しました.これがとても重要だと感じました.だから文章を書いてシェアしてみます.
1.作用ドメインチェーン:
コードが一つの環境で実行されると、変数オブジェクトからなる作用ドメインチェーンが作成されます.作用するドメインチェーンの用途は、環境へのアクセス権を確保するための検索友変数と関数の順序付きアクセスです.
2.スコープ内で識別子を検索する:
ある環境において、識別子を読み取りまたは書き込みのために引用する場合、その識別子が実際に何を表すかは検索によって決定されなければならない.検索プロセスは、ドメインチェーンのフロントエンドから開始し、与えられた名前に一致する識別子を上へ段階的に照会する.ローカル環境で識別子が見つかったら、検索プロセスが停止し、変数準備完了.この変数名がローカル環境で見つからない場合は、引き続きアクティブドメインチェーンに沿って上へ検索します.検索プロセスはグローバル環境の変数オブジェクトにまでさかのぼります.グローバル環境においてもこの識別子が見つからない場合、この識別子は声明であることを意味する.
3. 例を見てみましょう.
3.1
1.作用ドメインチェーン:
コードが一つの環境で実行されると、変数オブジェクトからなる作用ドメインチェーンが作成されます.作用するドメインチェーンの用途は、環境へのアクセス権を確保するための検索友変数と関数の順序付きアクセスです.
2.スコープ内で識別子を検索する:
ある環境において、識別子を読み取りまたは書き込みのために引用する場合、その識別子が実際に何を表すかは検索によって決定されなければならない.検索プロセスは、ドメインチェーンのフロントエンドから開始し、与えられた名前に一致する識別子を上へ段階的に照会する.ローカル環境で識別子が見つかったら、検索プロセスが停止し、変数準備完了.この変数名がローカル環境で見つからない場合は、引き続きアクティブドメインチェーンに沿って上へ検索します.検索プロセスはグローバル環境の変数オブジェクトにまでさかのぼります.グローバル環境においてもこの識別子が見つからない場合、この識別子は声明であることを意味する.
3. 例を見てみましょう.
3.1
var
name =
"hello"
;
・
function
test(){
alert(name);
//undefined
var
name =
"world"
;
alert(name);
//world
}
test();
: まず test()のスコープには、 の オブジェクトとグローバル オブジェクトの2つのオブジェクトが まれます.グローバル オブジェクト(すなわちWindowオブジェクト)にはname=「hello」とWindowオブジェクト が つ があり、グローバルスコープの にはグローバルスコープが かれています. ではtest の オブジェクトとして、alert、name、alertの3つの があります.test がまだ されていないので、この のname の はundefinedです.alert(name);
//undefined
この の 、jsエンジンは の となるスコープの にname を つけて します.
var
name =
"world"
;
name の はすでにworldに り てられていますので、 のalertはworldをプリントします.
3.2 var
name =
"hello"
;
・
function
test(){
alert(name);
//hello
name =
"world"
;
alert(name);
//world
}
test();
:この も と じように、Window ドメインオブジェクトは の と じ(name=hello)、testの を します.jsにプリコンパイルの があるので、jsは セグメントjsコードを する に、まずvarキーワードとfunction を します.しかし、この のtestの にはvar の がないので、この name はtestというスコープの にはありません.ここで、varキーワード の を うと、この は い に に されます. にとって、この い は のローカル です. が されていないとき されると、 にグローバル に されます.したがって、nameは 、グローバルスコープオブジェクトの とされています.しかし、その はまだハローです.まだ されていません.name =
"world"
;
そのため alert(name);
//hello
グローバル からハローの が され、 されました.
name =
"world"
;
グローバル のnameはworldに り てられています.alert(name);
//world
がワールドです.
3.3 name =
"hello"
;
・
function
test(){
alert(name);
//undefined ---》》》
var
name =
"world"
;
alert(name);
//world
}
test();
name =
"hello"
;
function
test(){
alert(name);
//hello
name =
"world"
;
alert(name);
//world
}
test();
の つの の は しやすいです.
:オーケー、もう つ します.
ウェブブラウザでは、グローバル はWindowオブジェクトと なされているため、すべてのグローバル と はWindowオブジェクトの と として され、ある のすべてのコードが された に が され、その に されているすべての と も されます.グローバル はアプリケーションが することを っています.