JavaScriptで再帰呼び出しを検索しましたが、 "名前のない"関数の再帰呼び出しを行いたいとします。名前のない関数の再帰関数呼び出しJavaScript
私はグーグルを使用して見つけるの結果は、この
function foo() {
setTimeout("foo()",0);
}
のようなものですが、私は次のようになり、何かしたい:
(function() { alert(this.function) })()
を可能にこのですか?
JavaScriptで再帰呼び出しを検索しましたが、 "名前のない"関数の再帰呼び出しを行いたいとします。名前のない関数の再帰関数呼び出しJavaScript
私はグーグルを使用して見つけるの結果は、この
function foo() {
setTimeout("foo()",0);
}
のようなものですが、私は次のようになり、何かしたい:
(function() { alert(this.function) })()
を可能にこのですか?
strict mode
にいない場合は、arguments.callee
で関数オブジェクトを取得できます。MDNドキュメントを参照してください。例えば
(function() {
console.log(typeof arguments.callee); // "function"
arguments.callee(); // call to itself
})();
しかし、また、そこに示唆したように、あなたはとても
(function foo() {
foo(); // call to itself
})();
私の知る限りでは同じように、あなたがすることはできません、この文を避け、機能に識別子を与える必要があります。それを呼び出すための参照(名前または変数)が必要です。
がarguments.callee
ですが、それは
注意をがっかりだけど:あなたはarguments.calleeのを()を使用して避けて、ちょうどすべての関数(式)の名前を与える必要があります。
基本的には、Y-Combinator(またはWikipediaがFixed Point Combinatorと呼んでいるもの)を探しています。
このブログの記事は良い導入を与えているようだ(私だけが...それをすべて説明できることを確認していない、それを脱脂)
http://blog.jcoglan.com/2008/01/10/deriving-the-y-combinator/
var Y = function(f) {
return (function(g) {
return g(g);
})(function(h) {
return function() {
return f(h(h)).apply(null, arguments);
};
});
};
var factorial = Y(function(recurse) {
return function(x) {
return x == 0 ? 1 : x * recurse(x-1);
};
});
factorial(5) // -> 120
編集: 私はからということを盗みました記事、およびI認めざるを得ない、私はそれが本当に混乱見つけ、Yは
var Y = function(f) {
var c1 = function(g) {
return g(g);
};
var c2 = function(h) {
return function() {
return f(h(h)).apply(null, arguments);
};
}
return c1(c2);
};
として良く読み、それを見てからかもしれないが、私はそれがだか分かりませんそれがすべきであるように単純です。 javascriptでfixpointコンビネータを定義する最大の欠点は、あなたの関数が無限に繰り返されないように、ある種の遅延評価が必要なことです。私は単純なバージョンを投稿する前に、それについて考えるか、記事を再読しなければならないでしょう。もちろん、私はこのようなものがどれくらいあなたを助けてくれるのか、とくにパフォーマンスが賢明かどうかはわかりません。他の人が示唆しているように、おそらく匿名ブロックを作成し、関数を正常に定義し、ブロックから返すようにするのが最も簡単な解決策です。値としての機能を渡すとき
あなたは、機能の名称を使用することができます:あなたは使用しないでください
setTimeout(function foo() { alert(foo); });
。呼び出し先
あなたはちょうどあなたがあなたの関数の名前を与えたくない何らかの理由があるの内側の範囲
setTimeout(function namedFn(x) {
// namedFn() exists in here only (see notes below)
console.log('hello there ' + x);
if (!x || x < 10) {
namedFn(1 + x || 1);
}
}, 5000);
// namedFn() is undefined out here **(except for IE <= 8)**
内部のみ利用可能である機能を、名前は? –