JavaScript匿名関数のブロックレベルのスコープを模倣する
1852 ワード
匿名関数
関数はJavaScriptの中で最も柔軟なオブジェクトです.ここではその匿名関数の用途を説明するだけです.
匿名関数:関数名がない関数です.
関数の定義は、まず簡単に関数の定義を紹介します.大きく三つの方法に分けられます.
第一種類:これも最も一般的なものです.
JavaScriptにはブロックレベルのスコープ概念がない.つまり、ブロックレベルのステートメントで定義されている変数は、ステートメントではなく関数(外部関数)を含む変数で実際に作成されます.
この技術は大域作用域において関数の外部でしばしば用いられ,大域作用域に過剰な変数と関数の追加を制限する.
一般的には、グローバルスコープに変数と関数を追加することをできるだけ減らすべきです.
この方法は、匿名関数への参照がないので、関数の実行が完了すれば、その作用領域チェーンをすぐに廃棄することができるので、クローズドメモリの問題を減らすことができる.
関数はJavaScriptの中で最も柔軟なオブジェクトです.ここではその匿名関数の用途を説明するだけです.
匿名関数:関数名がない関数です.
関数の定義は、まず簡単に関数の定義を紹介します.大きく三つの方法に分けられます.
第一種類:これも最も一般的なものです.
function double(x){
return 2 * x;
}
第二の方法:この方法はFunctionコンストラクタを使用しており、パラメータリストと関数体を文字列として使用するのは不便で、使用を推奨しない.
var double = new Function('x', 'return 2 * x;');
第三種類:
var double = function(x) { return 2* x; }
右の関数は匿名関数です.関数を作成した後、変数スクウェアに与えられます.JavaScriptにはブロックレベルのスコープ概念がない.つまり、ブロックレベルのステートメントで定義されている変数は、ステートメントではなく関数(外部関数)を含む変数で実際に作成されます.
function outputNumber(count){
for(var i=0;i<1000;i++){
alert(i);
}
alert(i); //count
}
この関数はjava、C22003;などの言語の中で、変数iはfor循環語句の中で定義があるだけで、循環が終わって、iも廃棄されました.ただし、JavaScriptでは、変数iはoutput Number()の活動対象として定義されていますので、その定義が始まり、関数内部でアクセスできます.同じ変数を再宣言しても、その値は変わりません.
function outputNumber(count){
for(var i=0;i<1000;i++){
alert(i);
}
var i; //
alert(i); //count
}
匿名関数は、ブロックレベルのスコープを模倣し、この問題を回避するために使用され得る.ブロックレベルのスコープ(プライベートスコープとも称する)の匿名関数としてのシンタックスは以下の通りである.
(function(){
//
})()
上記のコード定義は、関数宣言を小かっこに含めて匿名関数を呼び出します.これは関数式です.次のペアに続く小かっこは、すぐにこの関数を呼び出します.いつでも、一時的に変数が必要であれば、私用ドメインを使ってもいいです.
function outputNumber(count){
(function(){
for(var i=0;i<1000;i++){
alert(i);
})();
alert(i); //
}
このように,私たちはforサイクルの外部にプライベートロールドメインを挿入した.匿名関数で定義された任意の変数は、実行終了時に破棄されます.この技術は大域作用域において関数の外部でしばしば用いられ,大域作用域に過剰な変数と関数の追加を制限する.
一般的には、グローバルスコープに変数と関数を追加することをできるだけ減らすべきです.
この方法は、匿名関数への参照がないので、関数の実行が完了すれば、その作用領域チェーンをすぐに廃棄することができるので、クローズドメモリの問題を減らすことができる.