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
}
しかし、返された配列の要素は関数の実行結果であることがわかりました。しかし、私たちが望んでいるのは、関数がコードをアップグレードする必要があるということです
解決策 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);

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

ホットトピック









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

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

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

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

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

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

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

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