クロージャの理解
1. クロージャーを生成するには?
* ネストされた内部(子)関数がネストされた外部(親)関数の変数(関数)を参照すると、クロージャが生成されます
2. クロージャーとは何ですか?
* Chrome デバッグを使用して表示
* 理解1:クロージャはネストされた内部関数です(ほとんどの人)
* IIを理解する:参照された変数が含まれ(機能)オブジェクト(人の一握りを)
* 注:クロージャーはネストされた内部関数に存在します
3. 閉鎖の条件は何 ですか?
* 関数のネスト
* 内部関数は、外部関数(変数/ 関数)のデータを参照します
※ 実行関数定義(外部関数実行時など)
(実行関数の定義は、内部関数を呼び出すことなく、閉鎖を持っています前処理された外部関数を呼び出すときに生じるであろう生の実行コンテキストを、そしてあなたが内部定義された機能を実行することができます)
このタイプの関数定義は、すでに22行目にクロージャを生成しています。
関数定義が変数に割り当てられている場合、fn2は前処理中に変数として昇格され、値は未定義であり、関数定義は実行されないため、22行目でクロージャーを生成できません。閉鎖はありません。
この方法で宣言された関数オブジェクトは、 26 行目の関数定義全体が実行されるまでクロージャを生成しません。
一般的な閉鎖
1. 関数を別の関数の戻り値として使用する
2. 関数を引数として別の関数呼び出しに渡す
内部関数が作成された回数と外部関数が実行された回数を確認します。
内部関数の繰り返し実行中に、なぜクロージャーが消えなかったのですか?
実行仕上げ全く閉鎖、存在しない場合 = FN1()F VAR 後の背後に姿を消したが、fは()できないからFN1 トーンの内部A 。
メッセージは閉鎖中です、時間はありません
クロージャーの役割
1. 関数の関数内の変数はメモリ内に、まだ生きて完成された(拡張ローカル変数生のライフサイクル)
2. 外部関数が動作することがう(読み出しおよび書き込み)内部データ機能に(変数/ 関数)
問題:
1. 関数の実行後、関数内で宣言されたローカル変数はまだ存在しますか?
一般的には存在せず、クロージャに存在する変数が存在する可能性があります。
(「可能」とは、クロージャが配置されている関数オブジェクトがガベージオブジェクトにならないことを意味します)
それは理由に、関数は性質がリリースされる予定の内側に終了したスタンドが、関数は内部関数の場合では、外部関数を使用してオブジェクト戻りグローバル変数に割り当てられた道、
そして、この関数オブジェクトが保持され、ローカル変数とそれに関連する閉鎖バッグが生き残る一方で、生きています。
2. 関数内のローカル変数は、関数の外で直接アクセスできますか?
できません。しかし、クロージャーを介して外部で動作させることができます。
( 「TO 手段閉鎖することにより、外部操作を行う」:内部関数のネストされた関数を、この関数内では同様のオブジェクトを書き込むため ++ 内部変数の動作の関数とすることができるような修飾、
次に、この内部関数オブジェクトを外部グローバル変数に割り当てます。関数内のローカル変数を外部で操作できます)
クロージャーのライフサイクル
1. 生成:ネストされた内部関数定義が実行されたときに発生します(呼び出しではありません)。
2. 死:ネストされた内部関数がガベージオブジェクトになったとき
クロージャの終了(クロージャを含む関数オブジェクトはガベージオブジェクトになります)
f = null
クロージャーアプリケーション _ カスタムJS モジュール
* 特定の機能を持つJS ファイル
* すべてのデータと関数を関数内にカプセル化(プライベート)
* n個のメソッドを含むオブジェクトまたはメソッドのみを公開する
* モジュールのユーザーは、対応する機能を実現するために、モジュールによって公開されたオブジェクトを介してメソッドを呼び出すだけで済みます
最初の
第二
これは直接呼び出すことができ、最初のものより便利です。
また、コード圧縮時の詳細、上下の括弧は window と表記しています。
すべてのウィンドウをwに圧縮できます。
クロージャーの欠点と解決策
1. 短所
※ 関数実行後、関数内のローカル変数は解放されず、メモリ時間が長くなります
* メモリリークが発生しやすい
2. 解決する
* クロージャーなしで使用できます
* タイムリーなリリース
f = null // 内部関数をガベージオブジェクトにする- > クロージャを回復する
メモリオーバーフローとメモリリーク
1. メモリオーバーフロー
※ プログラム実行時に発生するエラー
* プログラムの実行に必要なメモリが残りのメモリを超えると、メモリオーバーフローエラーがスローされます
2. メモリリーク
* 占有メモリは時間内に解放されません
* メモリリークが過度に蓄積するとメモリオーバーフローが発生する
* 一般的に使用されるメモリリーク:
* 予期しないグローバル変数(関数でvar なしで定義された変数)
* 時間内にクリーンアップされないタイマーまたはコールバック関数(ループタイマーの開始後にクリーンアップしないでください)
* クロージャ(埋め込み関数オブジェクトをガベージオブジェクトにするためのアクティブなf = nullがない場合、クロージャは常に存在します)