次の名前付き関数を検討してください。
function f() {
return f.apply(this, arguments);
}
この関数を通常どおり呼び出すと、予想どおりスタック オーバーフローが発生します。あまり面白くありません。それでは、魔法をかけてみましょう。
var g = f, f = alert;
これを呼び出すf
と、単にalert
最初の引数になります。ただし、それを呼び出すg
とalert
、最初の引数になります。何が起こっていますか?呼び出すとg
スタック オーバーフローが発生してはいけませんか?
私が理解しているのは、関数内f
(現在g
)で変数f
がバインドされなくなったことf
です。自由変数になります。f
したがって、変数の内部はf
を指しalert
ます。
なぜこれが起こるのですか?名前付き関数内の関数名は、常に関数自体を参照することを期待しています。私は不平を言っていません。それは実際にはかなりクールです。私はただ興味があります。