JavaScript クロージャーの理解と例_JavaScript スキル
ちなみに、注意:
字句スコープ: 変数のスコープは、実行時ではなく定義時に決定されます。つまり、字句スコープはソース コードに依存し、静的を通じて決定できます。したがって、字句スコープは静的スコープとも呼ばれます。 withとevalを除けば、JSのスコープ機構は字句スコープ(Lexicalscope)に非常に近いとしか言えません。
次に、グローバル変数を使用した簡単なクロージャーの例を示します。
var sWord="こんにちは。Web フロントエンド開発エンジニアのブログへようこそ。アドバイスをお願いします。
function disWord(){
alert(sWord) ;
}
disWord();
分析: スクリプトがメモリにロードされるとき、disWord は sWord の値を計算しませんが、関数の実行時に sWord の計算を実行します。 disWordと呼ばれます。
次に、別の関数を定義する関数内のクロージャの例を示します。
var iNum=10;
function add(num1,num2){
function doAdd(){return num1 num2 iNum;}
return doAdd( );
}
分析: 内部関数 doAdd は、受信パラメーター num1、num2 の値を取得しますが、グローバル変数 iNum はパラメーターを受け入れません。追加の最後のステップでは doAdd を呼び出します。2 つのパラメータとグローバル変数 iNum を取得して、doAdd で使用される値が実行環境で取得されることがわかります。
以下は、字句範囲とクロージャーを理解した、インターネット上にあるいくつかの例です
、ケース 1
/*グローバル (ウィンドウ) ドメイン下のコード*/
function a(i) {
var i ;
alert(i);
a(10);
質問: 上記のコードは何を出力しますか?
答え: 10.
具体的な実行プロセス
a 関数には仮引数 i があり、a 関数を呼び出す際に実引数 10 が渡され、仮引数 i=10 となります。
次に、ローカル変数 i を定義します。同じ名前で値が割り当てられていません
alert 出力 10
考察: ローカル変数 i と仮パラメータ i は同じ記憶領域ですか?
、ケース 2
2 function a(i) {
3 alter(i); //arguments[0];仮パラメータ i
5 var i = 2;
7 alter(arguments[0]);
9 a(10); ;
質問: 上記のコードは何を出力しますか?
答え: 10,10,2,2
具体的な実行プロセス
最初のアラートは、仮パラメータ i の値 10 を出力します。
2 番目のアラートは、arguments[0] を出力します。これも i である必要があります
次にローカル変数 i を定義し、代入される値は 2 です。このとき、ローカル変数 i=2
3 番目のアラートはローカル変数 i の値 2 を出力します。
4 番目のアラートは引数 a[ 0] もう一度
考え: これで局所変数 i と仮パラメータ i の値は同じですか?
、ケース 3
コードをコピー
質問: 上記のコードは何を出力しますか?
答え: 10
具体的な実行プロセス
最初の文は、仮パラメータ i と同じ名前のローカル変数 i を宣言しています。結果によれば、後の i は
を指していることがわかります。仮パラメータ i なので、ここでは、仮パラメータ i の値 10 をローカル変数 i に代入するのと同じです
考え方: ケース 2 と組み合わせると、これは基本的に、ローカル変数 i と仮パラメータ i は同じストア アドレスを指しています。
、ケース 4
コードをコピーします
質問: 上記のコードは何を出力しますか?
答え: 未定義、2
特定の実行プロセス
最初のアラートは未定義を出力
2 番目のアラートは 2 を出力
考え: 何が起こっているのでしょうか?
上記の例を見て、どのように実装すればよいか疑問に思うかもしれません。実装の詳細は何ですか? JSエンジンはどのように動作するのでしょうか?
解析プロセス
、実行シーケンス
コンパイル言語。コンパイル手順は、字句解析、構文解析、意味チェック、コードの最適化、バイト生成に分かれています。
インタープリタ型言語では、字句解析と構文解析を通じて構文解析ツリーを取得した後、解釈と実行を開始できます。ここでは、解析プロセスに関する簡単かつ独自の原理を示します。詳細な解析プロセス (さまざまな JS エンジンが異なります) については、さらなる検討が必要です。
ドキュメント ストリームに複数のスクリプト コードが含まれている場合。
ステップ 1. 最初のコードセグメントを読み取ります (JS 実行エンジンはプログラムを 1 行ずつ実行しませんが、解析されて実行されます)。
ステップ 2. 字句解析と構文解析を実行します。エラーがある場合は、構文エラー (括弧の不一致など) が報告され、ステップ 5 に進みます。
ステップ 3. 修正します。 [var ]変数と[function]定義は「事前解析」されます (正しい宣言のみが解析されるため、エラーは報告されません)
ステップ 4. コードセグメントを実行します。コードセグメントがあればエラーが報告されます。エラー (変数が未定義など)
ステップ 5. 別のコード セグメントがある場合は、次のコード セグメントを読み取り、ステップ 2 を繰り返します
ステップ 6. 終了
、特別な命令
すべての JSグローバル ドメイン (ウィンドウ) ドメイン内のコードを表示できます。これは自動的に実行される「匿名メソッド」ですが、この「匿名メソッド」内の他のメソッドは明示的に
と呼ばれた場合にのみ実行されます。主要な手順
上記のプロセスは、主に 2 つの段階に分かれています。
解析: 構文解析と事前解析を通じて、正当な構文解析ツリーを構築します。
実行: 特定の関数を実行します。JS エンジンが各関数インスタンスを実行すると、実行環境 (ExecutionContext) とアクティブ オブジェクト (activeObject) が作成されます (これらはホスト オブジェクトに属し、オブジェクトのライフ サイクルと一致します)。関数インスタンス) )
より詳細な分析資料の例は次のとおりです: http://www.jb51.net/article/24547.htm

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

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

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