jsクロージャ例まとめ_基礎知識

May 16, 2016 pm 04:31 PM
js 閉鎖

Js 閉鎖
閉鎖前に知っておくべきこと
1. 関数のスコープ
(1) Js 言語の特別な点は、グローバル変数を関数内で直接読み取ることができることです

コードをコピーします コードは次のとおりです:

<スクリプトタイプ="text/javascript">
var n=100;
関数parent(){
アラート(n);
}
parent();//100

php の場合

コードをコピーします コードは次のとおりです:

$n=100;
関数parent(){
echo $n;
}
parent();//n が未定義であるというエラーが報告されます
?>

(2). 関数内のローカル変数は関数の外で読み取ることはできません

コードをコピーします コードは次のとおりです:

<スクリプトタイプ="text/javascript">
関数parent(){
var m=50;
}
親();
alert(m);//エラー m が定義されていません

関数内で変数を宣言する場合は var を追加する必要があることに注意してください。追加しないとグローバル変数が宣言されます

コードをコピーします コードは次のとおりです:

関数parent(){
m=50;
}
親();
アラート(m);//50

//もちろん、これは php ではさらに当てはまります。

コードをコピーします コードは次のとおりです:

関数parent(){
global $m;//グローバル、定義と割り当ては分離する必要があります
$m=50;
}
親();
echo $m;//50
?>
//グローバルがない場合でも、未定義のエラーが報告されます

関数内でローカル変数を取得する必要がある場合は、関数内にサブ関数を定義するなど、JS 変数スコープの特性を利用する柔軟な方法を使用する必要があります。関数、親関数はグローバル、サブ関数は関数です。関数は親関数内の変数 (js コード全体のローカル変数) にアクセスできます

コードをコピーします コードは次のとおりです:

<スクリプトタイプ="text/javascript">
関数parent(){
var m=50;
関数son(){
アラート(m);
}
息子を返してください;
}
var s=parent();//結果をグローバル
に保存します s();//50

親内のすべてのローカル変数はその子関数に表示されますが、その子関数内のローカル変数はその親関数には表示されません。これは、子オブジェクトの独自のチェーン スコープ構造であり、親のすべての変数を検索します。オブジェクトを一度に 1 レベルずつ上に移動すると、親オブジェクトのすべての変数が子オブジェクトに表示されます。その逆は当てはまりません。上記の息子関数はクロージャです
こんな生徒もいるかも知れません

コードをコピーします コードは次のとおりです:

関数parent(){
var m=50;
関数son(){
アラート(m);
}
}
親();
son()//関数 Son が未定義であることを報告します

JavaScript では、関数内で宣言された関数はローカルであり、関数の実行が終了した後に解放されることに注意してください
this と php

の違いに注意してください

コードをコピーします コードは次のとおりです:

関数parent(){
関数son(){
$m=50;
echo $m;
}
}
親();
son();//50 を出力するとエラーは報告されません
?>

閉店

関数の内部に関数を定義し、関数の内部と外部をつなぐブリッジを定義します
クロージャーには 2 つの機能があります:
1 つは、前述した関数内の変数の読み取りです
2 つ目は、これらの変数の値をメモリに保存してデータ共有を実現することです
以下にクロージャーの例をいくつか示します

コードをコピーします コードは次のとおりです:

<スクリプトタイプ="text/javascript">
var cnt=(関数(){
var i=0;
戻り関数(){
アラート(i);
私;
}
})();
cnt();//0
cnt();//1
cnt();//2
cnt();//3


無名関数の実行結果(つまり、内部のサブ関数の宣言がグローバル変数cutに代入される)、iがメモリに保存されます
Cut() を実行する場合、値はメモリから直接取得されます。 i は cnt() 関数によってのみ呼び出すことができ、直接のalert(i) は機能しません
パラメータをクロージャ

に渡すこともできます。

コードをコピーします コードは次のとおりです:

var cnt=(関数(数値){
return function(){
アラート(番号);
番号 ;
}
})(5);
cnt();//5
cnt();//6
cnt();//7
//もちろん、呼び出し時にパラメータを渡すこともできます
var cnt=(関数(){
var i=0;
戻り関数(数値){
num =i;
アラート(番号);
私;
}
})();
cnt(1);//1
cnt(2);//3
cnt(3);//5

クロージャをより深く理解するために、次のコードを見てみましょう
たとえば、配列を返したいとします。配列には 5 つの関数があり、最初の関数は 0 をポップアップし、2 番目の関数は 1 をポップアップします。
コードをこのように書くと

コードをコピーします コードは次のとおりです:

関数ボックス(){
var arr=[];
for(i=0;i arr=function(){return i;}
}
戻り値
}
var a=box();
alert(a);//5 つの関数本体を含む配列
アラート(a[0]());
アラート(a[1]());

ポップアップ関数本体
function(){return i;} }
最後の i は 4 で、次は 5 になります
for ループ停止
すべてのケースで 5 個のポップアップが表示されることがわかりました。これは明らかに要件を満たしていません

解決策 1
内部の関数の自己即時実行

コードをコピーします コードは次のとおりです:

関数ボックス(){
var arr=[];
for(i=0;i arr=(function(num){return i;})(i);
}
戻り値
}
var a=box();
for(var i=0;i アラート(a);
}

しかし、返された配列の要素は関数の実行結果であることがわかりました。しかし、私たちが望んでいるのは、関数がコードをアップグレードする必要があるということです

解決策 2
クロージャの実装

コードをコピーします コードは次のとおりです:

関数ボックス(){
var arr=[];
for(var i=0;i

arr=(関数(数値){
戻り関数(){戻り値;}
})(i);

}
戻ります;
}

var arr=box();

for(var i=0;i

alert(arr());//0,1,2,3,4
}

キーコード

コードをコピー コードは次のとおりです:

arr=(関数(数値){
return function(){return num;}
})(i);


i=0のとき
arr[0]=(function(num){return function(){return num;}})(0);

1時


arr[1]=(関数(数値){戻り値関数(){戻り値;}})(1);

以上が閉店のメリットです!とてもシンプルで実用的です。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

推奨: 優れた JS オープンソースの顔検出および認識プロジェクト 推奨: 優れた JS オープンソースの顔検出および認識プロジェクト Apr 03, 2024 am 11:55 AM

顔の検出および認識テクノロジーは、すでに比較的成熟しており、広く使用されているテクノロジーです。現在、最も広く使用されているインターネット アプリケーション言語は JS ですが、Web フロントエンドでの顔検出と認識の実装には、バックエンドの顔認識と比較して利点と欠点があります。利点としては、ネットワーク インタラクションの削減とリアルタイム認識により、ユーザーの待ち時間が大幅に短縮され、ユーザー エクスペリエンスが向上することが挙げられます。欠点としては、モデル サイズによって制限されるため、精度も制限されることが挙げられます。 js を使用して Web 上に顔検出を実装するにはどうすればよいですか? Web 上で顔認識を実装するには、JavaScript、HTML、CSS、WebRTC など、関連するプログラミング言語とテクノロジに精通している必要があります。同時に、関連するコンピューター ビジョンと人工知能テクノロジーを習得する必要もあります。 Web 側の設計により、次の点に注意してください。

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

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

jsとvueの関係 jsとvueの関係 Mar 11, 2024 pm 05:21 PM

js と vue の関係: 1. Web 開発の基礎としての JS、2. フロントエンド フレームワークとしての Vue.js の台頭、3. JS と Vue の補完関係、4. JS と Vue の実用化ビュー。

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

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

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

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

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

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

See all articles