[JavaScript]匿名関数
2291 ワード
1.匿名関数とは?
匿名関数は名前のない関数です.その用途は非常に多いです.まず以下の例を見てみます.
次の例のように匿名関数を書くこともできる.
2.再帰
再帰関数とは、関数が名前で自身を呼び出します.例えば、
クローズドとは、別の関数のスコープにアクセスする権限を持つ変数の関数です.閉じたパケットを作成する一般的な方法は、関数の内部に別の関数を作成することです.例えば、
4.ブロックレベルの作用領域を模倣する
JavaScriptはブロックレベルのスコープがありません.例えば、
匿名関数は名前のない関数です.その用途は非常に多いです.まず以下の例を見てみます.
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); //
}
この記事は「青鋒ノート」のブログから、転載をお断りします.