ホームページ ウェブフロントエンド jsチュートリアル JavaScript クロージャーの理解と例_JavaScript スキル

JavaScript クロージャーの理解と例_JavaScript スキル

May 16, 2016 pm 06:21 PM
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

コードをコピー コードは次のとおりです:
1 /*グローバル (window) ドメインの下のコード */
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、仮パラメータ i=10
最初のアラートは、仮パラメータ i の値 10 を出力します。
2 番目のアラートは、arguments[0] を出力します。これも i である必要があります
次にローカル変数 i を定義し、代入される値は 2 です。このとき、ローカル変数 i=2
3 番目のアラートはローカル変数 i の値 2 を出力します。
4 番目のアラートは引数 a[ 0] もう一度
考え: これで局所変数 i と仮パラメータ i の値は同じですか?

、ケース 3




コードをコピー
コードは次のとおりです: /*グローバル (ウィンドウ) ドメインの下のコード*/ function a(i) {
var i = i;
a( 10)


質問: 上記のコードは何を出力しますか?
答え: 10
具体的な実行プロセス
最初の文は、仮パラメータ i と同じ名前のローカル変数 i を宣言しています。結果によれば、後の i は
を指していることがわかります。仮パラメータ i なので、ここでは、仮パラメータ i の値 10 をローカル変数 i に代入するのと同じです
2 番目のアラートは当然 10 を出力します
考え方: ケース 2 と組み合わせると、これは基本的に、ローカル変数 i と仮パラメータ i は同じストア アドレスを指しています。
、ケース 4




コードをコピーします

コードは次のとおりです: /*Global (ウィンドウ) ドメインの下のコード*/ var i=10; function a() { var i = 2; );
};


質問: 上記のコードは何を出力しますか?
答え: 未定義、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
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

C++ ラムダ式におけるクロージャの意味は何ですか? C++ ラムダ式におけるクロージャの意味は何ですか? Apr 17, 2024 pm 06:15 PM

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

C++ラムダ式でクロージャを実装するにはどうすればよいですか? C++ラムダ式でクロージャを実装するにはどうすればよいですか? Jun 01, 2024 pm 05:50 PM

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

C++ 関数におけるクロージャの長所と短所は何ですか? C++ 関数におけるクロージャの長所と短所は何ですか? Apr 25, 2024 pm 01:33 PM

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

クロージャによって引き起こされるメモリリークの問題を解決する クロージャによって引き起こされるメモリリークの問題を解決する Feb 18, 2024 pm 03:20 PM

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

関数ポインタとクロージャが Golang のパフォーマンスに与える影響 関数ポインタとクロージャが Golang のパフォーマンスに与える影響 Apr 15, 2024 am 10:36 AM

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

Java ではクロージャはどのように実装されますか? Java ではクロージャはどのように実装されますか? May 03, 2024 pm 12:48 PM

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

PHP 関数の連鎖呼び出しとクロージャ PHP 関数の連鎖呼び出しとクロージャ Apr 13, 2024 am 11:18 AM

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

golangの匿名関数とクロージャの長所と短所のまとめ golangの匿名関数とクロージャの長所と短所のまとめ May 05, 2024 am 09:54 AM

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

See all articles