フロントエンド開発が知っておくべきJSクロージャとアプリケーション_JavaScriptスキル
「フロントエンド開発者が知っておくべき JS プロトタイプと継承」の記事で、クロージャに関する記事を書くと書きましたが、最近、クロージャ アプリケーションの機能を強化する必要があることに気づいたので、この記事を延期することはできません。もっと長く。この記事では関数クロージャについて説明しており、オブジェクト クロージャ (with の使用など) については説明しません。私の言ったことは間違っていると思われる場合は、お気軽にコメントしてアドバイスをください。
1. クロージャの理論
まず、次の概念を理解する必要があります。
実行環境
関数が呼び出されるたび (関数が呼び出されるとき)が実行されると)、システムは関数の閉じられたローカル実行環境、つまり関数の実行環境を作成します。関数は、ローカル変数、関数パラメータの読み書き、内部ロジックの実行など、常に独自の実行環境で実行されます。実行環境を作成するプロセスには関数のスコープの作成が含まれており、関数も独自のスコープ内で実行されます。別の観点から見ると、各関数実行環境にはスコープ チェーンがあり、子関数のスコープ チェーンには親関数のスコープ チェーンが含まれます。スコープとスコープチェーンについては以下を参照してください。
スコープ、スコープチェーン、呼び出しオブジェクト
関数スコープは字句スコープと動的スコープに分かれています。
レキシカルスコープは関数定義時のスコープ、つまり静的スコープです。関数が定義されると、その字句範囲が決定され、関数構造の入れ子関係に基づいて関数の範囲が記述されます。このとき、関数のスコープチェーンが形成されます。スコープ チェーンは、これらのスコープをネストされた階層関係で接続します。関数の内部 [[scope]] 属性は、このスコープ チェーンを指します。
動的スコープとは、関数呼び出しが実行されるときのスコープです。関数が呼び出されるとき、関数内の [[scope]] 属性は最初に関数のスコープ チェーンを指し、次に呼び出しオブジェクトが作成され、呼び出しオブジェクトは関数パラメーターとローカル変数を記録するために使用されます。関数を作成し、ドメイン チェーンの先頭に置きます。動的スコープは、呼び出し元のオブジェクトをスコープ チェーンの先頭に追加することによって作成されます。このとき、[[scope]] は定義時にスコープ チェーンを持つだけでなく、呼び出し時に呼び出し元のオブジェクトも作成されます。つまり、実行環境のスコープは、関数の定義時に決定されたスコープ チェーンに、関数によって作成されたばかりの呼び出しオブジェクトを加えたものと等しく、新しいスコープ チェーンが形成されます。したがって、これは動的スコープであり、スコープ チェーンもそれに応じて変化します。ここでスコープを見ると、実際にはオブジェクト チェーンです。これらのオブジェクトは、関数が呼び出されたときに作成される呼び出しオブジェクトと、その上の最上位のグローバル オブジェクトまでの呼び出しオブジェクトです。
たとえば、グローバル環境の関数 A に関数 B がネストされている場合、関数 B のスコープ チェーンは、関数 B のスコープ -> 関数 A のスコープ -> グローバル ウィンドウのスコープになります。 。関数Bが呼び出された場合、識別子を探す際には、関数Bのスコープ→関数Aのスコープ→グローバルウィンドウのスコープに従って検索されます。実際には、呼び出しに従って検索されます。関数Bのオブジェクト→関数Aの呼び出しオブジェクト→グローバルオブジェクトの順で検索されます。つまり、関数が呼び出されるとき、関数のスコープ チェーンは実際には呼び出し元のオブジェクト チェーンになります。
クロージャ
動的実行環境では、データはリアルタイムで変化します。これらの非永続変数の値を維持するために、これらの動的データを格納するキャリアとしてクロージャを使用します。以下の文を当てはめるとよく理解できるでしょう)。クロージャの定義: いわゆる「クロージャ」とは、多くの変数とこれらの変数にバインドされた環境を持つ式 (通常は関数) を指します。つまり、これらの変数も式の一部です。
クロージャは関数内にネストされた内部関数であり、内部関数はすべてのローカル変数、パラメータ、および外部関数で宣言された他の内部関数にアクセスできます。内部関数が外部関数の外部で呼び出される場合、クロージャが生成されます。 (実際には、どの関数もグローバルスコープの内部関数であり、グローバル変数にアクセスできるので、ウィンドウのクロージャになります)
例えば、以下の例:
コードは次のとおりです:
同理,也可以用这种思想实现自增长的ID。
应用4:
这个是无忧上月MM的例子(点击这里查看原帖),用闭包实现程序的暂停执行功能,还蛮创意的。
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
把这个作用延伸下,我想到了用他来实现window.confirm。
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
看了上面的这些应用,再回到前面的一句话:在动态执行环境中,数据实时地发生变化,为了保持这些非持久型变量的值,我们用闭包这种载体来存储这些动态数据。这就是闭包的作用。也就说遇到需要存储动态变化的数据或将被回收的数据时,我们可以通过外面再包裹一层函数形成闭包来解决。
当然,闭包会导致很多外部函数的调用对象不能释放,滥用闭包会使得内存泄露,所以在频繁生成闭包的情景下我们要估计下他带来的副作用。
毕了。希望能对大家有所帮助。
者:JayChow
出处:http://ljchow.cnblogs.com

ホット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)

ホットトピック











ホーム画面から重要なものを削除してしまい、元に戻そうとしていますか?さまざまな方法でアプリのアイコンを画面に戻すことができます。 iPhoneでホーム画面から削除を元に戻す方法 前述したように、iPhoneでこの変更を復元する方法はいくつかあります。方法 1 – App ライブラリのアプリ アイコンを置き換える App ライブラリから直接ホーム画面にアプリ アイコンを配置できます。ステップ 1 – 横にスワイプして、アプリ ライブラリ内のすべてのアプリを見つけます。ステップ 2 – 前に削除したアプリのアイコンを見つけます。ステップ 3 – アプリのアイコンをメインライブラリからホーム画面上の正しい場所にドラッグするだけです。これが応用図です

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

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

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

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

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

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

匿名関数は簡潔で匿名ですが、可読性が低く、デバッグが困難です。クロージャはデータをカプセル化して状態を管理できますが、メモリの消費と循環参照が発生する可能性があります。実際のケース: 匿名関数は単純な数値処理に使用でき、クロージャは状態管理を実装できます。
