0

次の名前付き関数を検討してください。

function f() {
    return f.apply(this, arguments);
}

この関数を通常どおり呼び出すと、予想どおりスタック オーバーフローが発生します。あまり面白くありません。それでは、魔法をかけてみましょう。

var g = f, f = alert;

これを呼び出すfと、単にalert最初の引数になります。ただし、それを呼び出すgalert、最初の引数になります。何が起こっていますか?呼び出すとgスタック オーバーフローが発生してはいけませんか?

私が理解しているのは、関数内f(現在g)で変数fがバインドされなくなったことfです。自由変数になります。fしたがって、変数の内部はfを指しalertます。

なぜこれが起こるのですか?名前付き関数内の関数名は、常に関数自体を参照することを期待しています。私は不平を言っていません。それは実際にはかなりクールです。私はただ興味があります。

4

2 に答える 2

4

あなたがするとき:

var g = f

これは事実上、次と同じです。

var g = function () {
    return f.apply(this, arguments);
}

ただし、再割り当てfしたため、元の関数を指しなくなったため、 を指すようになりましたalert。設計どおりに動作しているようです。

于 2014-01-06T02:42:16.867 に答える