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