jsにおけるクロージャの概念
クロージャは JavaScript に固有のものではなく、ほとんどの高級言語にこの機能があります。
クロージャとは何ですか?
A クロージャは、バンドルされた(囲まれた)関数とその周囲の状態(字句環境)への参照の組み合わせです。
Thisセグメントは MDN におけるクロージャの定義であり、閉じられた語彙環境内の関数とその周囲の参照がクロージャを構成するものとして理解されます。この文はまだ理解しにくいかもしれません。例を見てください:
function createAction() { var message = "封闭环境内的变量"; return function() { console.log(message); } } const showMessage = createAction(); showMessage(); // output: 封闭环境内的变量
この例は典型的なクロージャです。注意すべき点がいくつかあります:
-
showMessage
は、実行後にcreateAction
から返される function です。 -
createAction
は内部的に閉じられた字句環境であり、message
はカプセル化された環境内の変数であり、外部から直接アクセスすることはできません。 -
showMessage
はcreateAction
の外部で実行されますが、実行中に内部定義されたローカル変数message
(成功した出力) にアクセスします。これは、showMessage
によって参照される関数 (createAction
内の匿名関数) が、定義時に字句環境 (createAction
内) にバインドされるためです。メッセージ
など)。 - 内部構文環境にバインドされた匿名関数は
return
でcreateAction
に持ち込まれ、閉じられた環境の外で使用され、クロージャを形成します。createAction
内で呼び出された場合、クロージャとみなされません。
わかりました、1、2、4 はすべて理解するのが簡単だと思いますが、最も重要なポイント 3 を理解するのは少し難しいかもしれません。難しいのは、これはプログラマが理解できることではないということです。それは言語の特性によって決まります。したがって、 「あなた」がクロージャを作成したとは考えないでください。クロージャは言語機能であり、この機能を利用しただけであるためです。
言語がクロージャをサポートしていない場合、上記のコードと同様に、showMessage を実行するときに、
message 変数が見つかりません。特に例を見つけたいのですが、残念ながら、関数/メソッド内で関数を定義できる限り、私が知っているすべての高級言語はクロージャをサポートしているようです。
return を通じてローカルに定義された関数を取り出すことができると述べましたが、これ以外に何か方法はありますか?
function encase(aCase) { const dog = "狗狗"; const cat = "猫猫"; aCase.show = function () { console.log(dog, cat); }; } const myCase = {}; encase(myCase); myCase.show(); // output: 猫猫 狗狗
exports.something を通じて商品を 1 つずつ持ってくることも、
module.exports = ... を通じて商品をパッケージ化することもできますが、何はともあれ、
exports が商品を運んでくるのですが、それは元々手配された
exports である可能性もあれば、独自の
exports の 1 つに置き換えられる可能性もあります。 。
import および
export 構文を使用します。これは商品を持ち出す別の方法であり、
return 商品の持ち出しは似ていますが、唯一の違いは、
return は 1 つだけ (パックされていない限り) を取得できるのに対し、
export は複数のグループを取得できることです。
const var1 = "我是一个顶层变量吧"; function maybeATopFunction() { }
// module factory function createModule_18abk2(exports, module) { const var1 = "我是一个顶层变量吧"; function maybeATopFunction() { } } // ... 遥远的生产线上,有这样的示意代码 const module = { exports: {} }; const m18abk2 = createModule_18abk2(module) ?? module; // 想明白 createModule_18abk2 为什么会有一个随机后缀没?
function create() { function closure() { } return closure; } const a = create(); const b = create(); console.log(a === b); // false
closure() を定義して、理解しやすいかどうかを確認してください:
function create() { closure = function() { } return closure; }
function create() { const a = function () { }; const b = function () { }; console.log(a === b); // false }
function のたびに新しい関数が定義されます。この機能は新しいものであり、名前は重要ではありません。あなたはこれを Xiao Ming と呼ぶことができますが、他の人は Xiao Ming と呼ぶこともできます。
クロージャは、それが定義されている閉じられた環境内の関数とさまざまなリソース (参照) で構成されます。クロージャを構成する環境リソースは異なります (異なるローカル環境、定義された異なるローカル変数、渡された異なるパラメータなど)。 おわりに、今回は分かりました!
推奨チュートリアル: 「
JS チュートリアル 」
以上がjsにおけるクロージャの概念の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









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

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

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

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

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

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

Java のクロージャを使用すると、外部関数が終了した場合でも、内部関数が外部スコープの変数にアクセスできるようになります。匿名の内部クラスを通じて実装されると、内部クラスは外部クラスへの参照を保持し、外部変数をアクティブに保ちます。クロージャによりコードの柔軟性が向上しますが、匿名の内部クラスによる外部変数への参照により、それらの変数が存続するため、メモリ リークのリスクに注意する必要があります。

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