高度なJavaScriptのスコープとクロージャ
このレッスンでは、話をすることです:
- JavaScriptのスコープ
- JavaScriptを閉鎖
スピーカー教師:ヘッド先生
A. JavaScriptのスコープ
セクションを包んブロックスコープブレース
{(; iは3 <I ++がVAR I = 1)のために
}
PS:JavaScriptの動的スコープではありません
関数f(){
警告(x)は、
}
関数f(){
F()
VAR X = 5。
}
F()。
二つの閉鎖.JavaScript
クロージャがクロージャの一般的な方法を作成するために、別の関数スコープ変数にアクセスする機能であり、それは別の関数で別の関数は、この関数のローカル変数に内部関数を作成することです。
//ローカル変数は閉鎖によって返すことができます
関数ボックス(){
VaRのユーザー= 'リー';
関数の戻り値は(){ 無名関数のローカル変数でボックス()を返す//
ユーザーを返します。
}。
}
アラート(箱()()); //ボックスから()()を直接匿名関数の戻り値を呼び出します
ここで、B =ボックス()。
アラート(B()); //別の無名関数の戻り値を呼び出します
クロージャを使用すると、利点を持っていますが、またその欠点:メモリに常駐することができますローカル変数は、グローバル変数の使用を避けること。(グローバル変数汚染は、各モジュールは、災害につながると呼ばれることができ、予測不可能性への応用を引き起こし、プライベート、ローカル変数のパッケージを使用することをお勧めします)。
//グローバル変数を介して蓄積します
年齢= 100 VAR; //グローバル変数
関数ボックス(){
++年齢; //モジュールレベル蓄積し、グローバル変数と呼ばれることができます
}
ボックス(); //関数を実行、累積
アラート(年齢); //グローバル変数の出力
//ローカル変数を蓄積することにより達成することができません
関数ボックス(){
年齢= 100でした。
++年齢; //が蓄積
年齢を返します。
}
警告(箱()); // 101
アラート(ボックス()); 初期化されているので、// 101は、達成することができません
//ローカル変数蓄積が閉鎖することによって達成することができます
関数ボックス(){
年齢= 100でした。
復帰機能(){
年齢++;
年齢を返します。
}
}
ボックスB = VAR(); //取得機能
アラートは、(B()); //無名関数を呼び出します
アラート(B()); // 2番目の呼び出し匿名関数、累積達成するために
スコープチェーン機構が最後の値にループ内の任意の変数匿名関数が得られる、という問題が生じます。
//ループは、匿名関数が含まれています
関数ボックス(){
= [] ARRました。
ため(VAR I = 0; iは5 '; iは++){
ARR [I] =関数(){
私は返します。
}。
}
ARRを返します。
}
ボックスB = VAR(); //関数配列を取得
アラート(のb.lengthする); //は、関数の集合の長さを取得
{(; iはてb.lengthを<I ++がVAR I = 0)のための
アラート(B [I]()); //各関数の出力は、最後の値であります
}
上記の例からの結果の出力は、iが得られるサイクルの最大値であり、5です。それは無名関数ですので、匿名関数は、コールの時まで、ボックス()は、すでに私は5になっていた、行われていたので、最終的な結果は、5件のB [i]がコールされ、自己施行ではありません。
1つの変更、自己執行無名関数 - //ループは、無名関数が含まれています
関数ボックス(){
= [] ARRました。
ため(VAR I = 0; iは5 '; iは++){
ARR [I] =(関数(NUM){ //自己を行います
確かに返します。
})(I); //パラメータ渡しと
}
ARRを返します。
}
ここで、B =ボックス()。
{(; iはてb.lengthを<I ++がVAR I = 0)のための
アラート(B [I]); //ここで返さは、ダイレクト印刷をすることができる配列であります
}
私たちは、[i]は配列ではなく、機能ですへの最終的なリターンをもたらし、無名関数の自己施行を作ります。最終的には[0] -b [4] 0,1,2,3,4の値を保持bにつながります。
このテーマについて
これはグローバルスコープのウィンドウである場合も、このオブジェクトの内部オブジェクトポイントならば、これは結合の実行時の実行環境関数でオブジェクトに基づいており、いくつかの問題を引き起こす可能性が閉鎖にこのオブジェクトを使用します。閉鎖プロパティやメソッドは、オブジェクトに属していないので、ウィンドウの閉鎖は、実行時に向けてきました。
VaRのユーザー=「ウィンドウ」;
VAR OBJ = {
ユーザー:「オブジェクト」
getUserFunction:関数(){
関数の戻り値(){ //これはウィンドウの内側を指し、閉鎖OBJに属していません
this.userを返します。
}。
}
}。
警告(obj.getUserFunction()()); //窓
//強制することができるオブジェクトを参照
警告(。obj.getUserFunction()の呼び出し(OBJ)); //オブジェクト