[JavaScript]匿名関数


1.匿名関数とは?
匿名関数は名前のない関数です.その用途は非常に多いです.まず以下の例を見てみます.
function myfunc(arg) {
}
var myfunc = function(arg) {
}
この二つの定義は論理的には等価であるが、やはり違いがある.前者はコード実行前にスコープにロードされます.後者はコード実行時に定義されます.もう一つの違いは、関数宣言が関数に名前を指定します.関数式は匿名関数を作成して、この匿名関数を変数に割り当てます.
次の例のように匿名関数を書くこともできる.
function(arg) {
}
このコードは完全に有効ですが、問題はこの関数を呼び出すことができません.この関数を指すポインタがないためです.しかし、関数をパラメータとして他の関数に伝えたり、関数から別の関数を返したりする際には、このような形で関数を定義します.
2.再帰
再帰関数とは、関数が名前で自身を呼び出します.例えば、
function factorial(num) {
  if (num <= 1) {
    return 1;
  }
  else {
    return num * factorial(num-1);
  }
}
ただし、以下のコードは問題を引き起こす可能性があります.
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(10)); //  
以上のコードは、factoral関数を変数another Factorialに保存し、factoral変数をnullに設定しましたが、これからanother Factorialを呼び出すと、factoralを実行しなければならないため、エラーが発生します.一方、argments.calleeは実行中の関数を指すポインタであり、したがって、再帰性を達成するために、例えば、
function factorial(num) { 
  if (num <= 1) { 
    return 1; 
  } 
  else { 
    return num * arguments.callee(num-1); 
  } 
}
3.クローズド
クローズドとは、別の関数のスコープにアクセスする権限を持つ変数の関数です.閉じたパケットを作成する一般的な方法は、関数の内部に別の関数を作成することです.例えば、
function myfunc(arg) {
  return function(myobj) {
    var value = myobj[arg];
  }
}
この例では、匿名関数は外部関数の変数argにアクセスし、この内部関数が戻ってきても、他の場所で呼び出されても変数argにアクセスすることができます.この変数にもアクセスできるのは、内部関数の作用ドメインチェーンにmyfunc()の作用領域が含まれているからです.
4.ブロックレベルの作用領域を模倣する
JavaScriptはブロックレベルのスコープがありません.例えば、
function myfunc(count) {
  for (var i=0; i<count; i++) {
    alert(i);
  }
  var i;
  alert(i);
}
JavaScriptでは、変数iが定義されていることから関数内部に随所にアクセスでき、間違っても同じ変数を再宣言します.JavaScriptは同じ変数を何度も宣言しているかどうかは教えません.その後の声明は無視されます.匿名関数は、例えばブロックレベルのスコープを模倣するために使用されてもよい.
(function() {
})();
上記のコードを定義し、直ちに匿名関数を呼び出します.関数宣言はペアの括弧に含まれています.これは実際に関数式であり、バックルに従う別のペアの括弧は直ちにこの関数を呼び出します.したがって、上記の例は次のように書き換えられます.
function myfunc(count) { 
  (function() {
    for (var i=0; i<count; i++) { 
      alert(i); 
    } 
  })();
  alert(i); //  
}
この記事は「青鋒ノート」のブログから、転載をお断りします.