JavaScript匿名関数のブロックレベルのスコープを模倣する

1852 ワード

匿名関数
関数は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サイクルの外部にプライベートロールドメインを挿入した.匿名関数で定義された任意の変数は、実行終了時に破棄されます.
この技術は大域作用域において関数の外部でしばしば用いられ,大域作用域に過剰な変数と関数の追加を制限する.
一般的には、グローバルスコープに変数と関数を追加することをできるだけ減らすべきです.
この方法は、匿名関数への参照がないので、関数の実行が完了すれば、その作用領域チェーンをすぐに廃棄することができるので、クローズドメモリの問題を減らすことができる.