JavaScriptを閉鎖
定義:閉鎖手段は、発現環境の変数の数を持っており、これらの変数(通常は関数)の結合、したがって、これらの変数はまた、式の一部です。
関数A(){ 私は0 = VAR。 関数b(){ I ++; 警告(I); } Bを返します。 } VAR C = A(); C(); // 1をポップ C(); // 2をポップ
関数の機能:
- 内部にネストされた関数B機能。
- 関数は、関数bを返します。
実行するときvar c=a()
ポップアップウィンドウの後に表示され、変数cが実際にC()値を実行し、関数Bを指します。
関数は関数の外に参照される変数Bの内部機能である場合、クロージャが作成されます。
クロージャ関数は内部変数の他の機能を読み取るための能力である、クロージャは、自然界に接続された内部機能と外部機能との間のブリッジではなく、外部から内部ず、外部アクセスへの内部アクセスです。
処置: B変数に依存する必要の内部関数の実行ので閉鎖は、解放されないような機能の実装後に、です。したがって上記の例を作り、各C Iが持続され()、I 1は、自己実行加算した値です。
//シミュレートプライベート変数 機能カウンタ(開始){ 使用して親オブジェクトとして//カウンタ機能 VaRのカウントが開始=; リターン{ 合計:関数(){ ++数えます。 }、 取得:関数(){ カウント数を返します。 } } } FN1 =カウンター(4)でした。 fn1.sum(); console.log(fn1.get()); //プリント値5
ここでは、関数は二つのクロージャカウンターを返し、関数sum関数を取得します。これらの二つの機能を使用すると、スコープ定義された変数の数にアクセスできるように、外部のスコープカウンターへの参照を維持することです。
基本的なアプリケーションのシナリオ:
- 保護セキュリティ関数内の変数(最初の機能には、例えば、関数で関数Iのみアクセスは、このように私のセキュリティを保護し、他の手段によってアクセスすることができないができB)。
- (iはメモリに持続関数、したがって各実行C()の閉鎖は、Iに1を加算するので、再び第1の例のように)メモリに変数を維持します。
実行完了の次のコードの決意の結果は、より良い理解の閉鎖を助けることができます。
VAR名=「ウィンドウ」。 VARオブジェクト= { 名前:「私のオブジェクト」、 getNameFunc:関数(){ 復帰機能(){ this.nameを返します。 }。 } }。 警告(object.getNameFunc()()); //ウィンドウをポップアップ
VAR名=「ウィンドウ」。 VARオブジェクト= { 名前:「私のオブジェクト」、 getNameFunc:関数(){ この= VAR。 復帰機能(){ that.nameを返します。 }。 } }。 警告(object.getNameFunc()()); //私のオブジェクトをポップ
ループで使用するためのクロージャ
表現()()
括弧内の第二のパス変数は、第1のブラケットは、隠された、可変伝達関数匿名ユーザによる第2ブラケットを受信し、プライベート(ローカル)変数を定義します。
ため(VAR I = 0、I <10; I ++){ (関数(W){ setTimeout(関数(){ (W)CONSOLE.LOG。 }、1000) })(私); }
//効果をし、上記と同様に機能し ため(VAR I = 0、I <10; I ++){ setTimeout((関数(E){ 復帰機能(){ console.log(e)を返します。 } })(I)、1000) }
上記の例では、外部の匿名関数は直ちに実行され、その引数として、私は、この時点で関数w iは可変のコピーを有すること。匿名のsetTimeout関数に渡さが実行されると、それは、Wへの参照を有し、この値は周期に変更されません。
閉鎖を受けた後に渡される変数はメモリアップテイク(推奨しません)まで解放されません
<のdivクラス= "divclosure"> <ボタン>按钮1 </ボタン> <butto 大きいカラム のJavaScriptクロージャ、オブジェクトオブジェクト N>ボタン2 </ボタン> <ボタン>按钮3 </ボタン> <ボタン>按钮4 </ボタン> <ボタン>按钮5 </ボタン> </ div> <スクリプト> VAR btns = document.querySelectorAll( "divclosureボタン。"); 以下のために(; I <btns.length; VAR iが0 = I ++){ btns [I] .style.width = 80 + "PX"。 btns [I] .style.height = 45 + "PX"。 btns [I] .style.borderRadius = 10 + "ピクセル"; btns [I] .style.marginRight = 10 + "ピクセル"; (関数(W){ btns .onclick =関数[W](){ 警告(W); } })(私); } </ SCRIPT>
オブジェクトオブジェクト
1.第一の方法
<スクリプト> //オブジェクト VaRの人=新しいオブジェクト(); //プロパティ person.finger = 10。 person.name = "人"。 person.age = 23; //メソッド person.sayHello =関数(){ document.write(+ this.name + "こんにちは、私の名前は" ";"); } person.sayAge =関数(){ document.write(+ this.age + "私は" "歳;"); } person.studyAge =関数(研究、夢){ document.write( "I" +研究+ "を開始学校、私はなりたい" + +夢 ";") } VaRの暁明=新しいオブジェクト(); xiaoming.name = "小明"。 xiaoming.age = "23"; person.sayHello(); person.sayAge(); person.sayHello.call(暁)。 person.sayAge.call(暁)。 person.studyAge.call(暁、6、 "科学家")。 person.studyAge.apply(暁、[6、 "科学家"]) </ SCRIPT>
呼び出し方法:
この点のメソッド内部を変える、使用される方法は、元のオブジェクトである、データは、このオブジェクトの呼び出しによって得られる、別のオブジェクトに現在のオブジェクトを交換する方法であって、オブジェクトを呼び出します。
関数呼び出し(OBJ、[PARAM1 [、PARAM2 [、... [、paramNの]]]])
OBJ:オブジェクトは、関数、クラスにこの主題を交換します
params:これは、パラメータのリストです
この方法を適用します。
呼び出し方法と同様に異なる引数リストを意味し;、現在のオブジェクトを置き換えるために別のオブジェクトへのオブジェクトへのメソッド呼び出しです。
2つのパラメータを受信するfunction.apply(OBJ、引数)方法
OBJ:オブジェクトはこの主題でFunctionクラスに置き換えられます
引数:これは配列である、それは関数のパラメータとして機能します(args->引数)