閉鎖とは何ですか
クロージャとは:
クロージャは、別の関数のスコープ内の変数にアクセスできる関数です。
–《JavaScript高度なプログラミング》
在这个函数fun2中可以访问另一个函数中的变量a,所以fun2()就是一个闭包。 function fun1 () { var a = 0; function fun2 () { console.log(a); } fun2(); }ログイン後にコピー
1.定義した関数の外でclosureメソッドを呼び出す、escapeメソッド:
(1)内部関数をグローバル変数に代入する;
var globalVar; function outer() { console.log(‘outer’); function inner(){ console.log(‘inner’); } globalVar = inner; } outer(); // outer globalVar(); // inner;ログイン後にコピー
の中で例えば、 inner() は、グローバル変数の参照を介して脱出できました。これで、グローバルに呼び出すことができ、outer() の変数を参照できるようになります
(2) 値を返すことで、inner 関数の参照を「救出」します。
function outer() { console.log(‘outer’); function inner(){ console.log(‘inner’); } return inner; } var fn = outer(); // outer fn(); // inner;ログイン後にコピー
この例では、inner()は値を返すことで正常にエスケープし、グローバルに呼び出せるようになり、outer()の変数を参照できるようになりました
2.関数外でクロージャを呼び出すことの影響:増加メモリ使用量;
それは正常です 状況は、関数呼び出しが終了した後、関数の実行環境が環境スタックから離れ、定義された変数が破棄され(破棄はガベージコレクションメカニズムに関連します)、アクティブな変数(変数オブジェクト) が破棄され、メモリが解放されます。しかし、クロージャのスコープ チェーンには外部関数の変数オブジェクトが含まれるため、ガベージ コレクション メカニズムは外部関数の変数と外部関数の変数オブジェクトを再度参照する可能性があります。関数はメモリに保持されます。これにより、メモリ使用量が増加します。
3. クロージャと変数の関係: クロージャでよくある誤解と解決テクニック
クロージャは関数を含む変数オブジェクト全体を保存し、取得される外部オブジェクト変数はクロージャが呼び出された時点のオブジェクト変数です。 、これは外部関数変数の最後の値です。
例:
function createFun() { var result = []; for ( var i = 0; i < 10; i++) { result[i] = function() { return i; }; } return result; } var result = createFun(); console.log(result5); // 10ログイン後にコピー
ここでの外部関数の戻り値は配列であり、その配列値は異なる関数(クロージャ)への参照であると誤解してしまいますが、各クロージャ呼び出しの戻り値は異なります。しかし実際には、各関数は同じ値を返します。クロージャが呼び出されるとき、クロージャを呼び出した外部関数が実行されています。このとき、外部関数の変数オブジェクトでは i = 10 であり、クロージャの戻り値は i であるため、クロージャは外部関数を取得します。呼び出し時の変数オブジェクト、この時点の i は 10 です。
解決策:
function createFun() { var result = []; for ( var i = 0; i < 10; i++) { result[i] = function(num) { return function() { return num; }; }(i); } return result; } var result = createFun(); console.log(result5); // 5ログイン後にコピー
ループ内で匿名配列を定義し、匿名関数を即座に実行した結果をその配列に代入します。ここでの匿名関数にはパラメーター num があり、毎回 i がパラメーターとして渡されます。 num、numがループされるたびに異なる値が取得されるため、毎回異なる関数が返されます(違いは、配列の値が外部から呼び出された場合に異なる値が返されることです)。 、 予想通り。
4. クロージャ内の this の値に注目してください
まず、関数内の this の点ですが、明示的に呼び出しているオブジェクトがない場合、this は関数を呼び出すオブジェクトを指していることを知っておく必要があります。ウィンドウオブジェクトを指します。
クロージャ内のこの点は、例えば:
var name = “window”; var o = { name: “object”, getName: function() { return function() { return this.name; }; } }; console.log(o.getName()()); // windowログイン後にコピー
クロージャ this がグローバル オブジェクトを指していることがわかります。分析すると、o.getName()() を (o.getName) と書くことができます。 ()) () の場合、この式は最初のステップで o.getName() を実行することと同じです。この関数は匿名関数 (クロージャ) を返し、オブジェクト o を通じてグローバルに呼び出されません。グローバルオブジェクトを指します。
5. メモリリークの問題、不要なメモリ使用量を減らす方法
function assignHandler() { var ele = documnet.getElementById(“somenode”); ele.onclick = function() { console.log(ele.id); }; }ログイン後にコピー
上記の例では、eleの定義方法が匿名関数に関係しているので、eleは匿名関数への参照を保存し、クロージャはそれを参照します。 包含関数は ele オブジェクトも参照します。これにより、オブジェクトへの循環参照が発生します。ele 要素 (dom 要素は大量のメモリを占有します) は常にメモリに格納され、解放できません。以下の通り:
rreee
以上が閉鎖とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C++ では、クロージャは外部変数にアクセスできるラムダ式です。クロージャを作成するには、ラムダ式の外部変数をキャプチャします。クロージャには、再利用性、情報の隠蔽、評価の遅延などの利点があります。これらは、イベント ハンドラーなど、外部変数が破棄されてもクロージャが外部変数にアクセスできる現実の状況で役立ちます。

C++ ラムダ式は、関数スコープ変数を保存し、関数からアクセスできるようにするクロージャーをサポートしています。構文は [キャプチャリスト](パラメータ)->戻り値の型{関数本体} です。 Capture-list は、キャプチャする変数を定義します。[=] を使用してすべてのローカル変数を値によってキャプチャするか、[&] を使用してすべてのローカル変数を参照によってキャプチャするか、[variable1, variable2,...] を使用して特定の変数をキャプチャできます。ラムダ式はキャプチャされた変数にのみアクセスできますが、元の値を変更することはできません。

クロージャは、外部関数のスコープ内の変数にアクセスできる入れ子関数です。その利点には、データのカプセル化、状態の保持、および柔軟性が含まれます。デメリットとしては、メモリ消費量、パフォーマンスへの影響、デバッグの複雑さなどが挙げられます。さらに、クロージャは匿名関数を作成し、それをコールバックまたは引数として他の関数に渡すことができます。

タイトル: クロージャによって引き起こされるメモリ リークと解決策 はじめに: クロージャは JavaScript における非常に一般的な概念であり、内部関数が外部関数の変数にアクセスできるようにします。ただし、クロージャを誤って使用すると、メモリ リークが発生する可能性があります。この記事では、クロージャによって引き起こされるメモリ リークの問題を調査し、解決策と具体的なコード例を提供します。 1. クロージャによるメモリリーク クロージャの特徴は、内部関数が外部関数の変数にアクセスできることです。つまり、クロージャ内で参照される変数はガベージコレクションされません。不適切に使用すると、

Microsoft が開発した Windows 10 オペレーティング システムを使用する過程で、多くのユーザーが Cortana と呼ばれる新しいテクノロジに興味を持ち、混乱しています。Cortana の中国語での正式名は「Cortana」で、実際には Windows の組み込み機能です。 10 システム. Cortana、人工知能 (AIassistant) サービス プログラム. よくある質問と解決策. Cortana を開いて応答しない方法. 解決手順. 中国語の解決策はサポートされていません. Cortana に検索ボックスを入れる方法. Cortana とはどのようなソフトウェアですか? 答え: 「Cortana」 Microsoft が注意深く構築したクラウド プラットフォームのパーソナル インテリジェント アシスタントで、ログインと非ログインの 2 つの使用モードがあります。ログインしているとき

はい、コードの単純さと読みやすさは、連鎖呼び出しとクロージャーによって最適化できます。連鎖呼び出しは、関数呼び出しを流暢なインターフェイスにリンクします。クロージャは再利用可能なコード ブロックを作成し、関数の外の変数にアクセスします。

関数ポインタとクロージャが Go のパフォーマンスに与える影響は次のとおりです。 関数ポインタ: 直接呼び出しよりわずかに遅くなりますが、可読性と再利用性が向上します。クロージャ: 一般に遅いですが、データと動作をカプセル化します。実際のケース: 関数ポインターは並べ替えアルゴリズムを最適化でき、クロージャーはイベント ハンドラーを作成できますが、パフォーマンスの低下をもたらします。

Go 言語の関数クロージャは単体テストで重要な役割を果たします。 値のキャプチャ: クロージャは外側のスコープ内の変数にアクセスできるため、テスト パラメータをキャプチャしてネストされた関数で再利用できます。テスト コードの簡素化: クロージャは値をキャプチャすることで、ループごとにパラメーターを繰り返し設定する必要性を排除し、テスト コードを簡素化します。可読性の向上: クロージャを使用してテスト ロジックを整理し、テスト コードをより明確で読みやすくします。
