2

私はこれを書いた:

alert = function(x) {
    alert(x);
};
alert(1);

そしてFirefoxのコンソールが表示されましたToo much recursion

と:

var x = alert;
alert = function(y) {
    x(y);
};
alert(1);

完璧に動作します。

なぜ2番目の方法が機能し、最初の方法が機能しないのですか?

そしてfoo=foo;動作します。alert=function(x){alert(x);};と同じではありませんfoo=foo;か?

4

1 に答える 1

4

いいえ。書くとき:

alert=function(x){alert(x);};

呼び出されると、スタックスペースがなくなるまで無限に呼び出す関数を作成しています。作成した「アラート」シンボルはグローバル変数になります。関数内では、関数が呼び出されると、「アラート」シンボルがそのグローバル変数に解決されます。

JavaScriptのセマンティクスにより、関数内の変数への参照は、関数を呼び出すたびに新たに解決されます。その関数を定義した後、次のようなことをした場合:

var otherAlert = alert;
window.alert = function() { console.log("Hello world"); };

その時点で「alert」は別のグローバル関数になるため、「otherAlert」を呼び出してもエラーは発生しません。

于 2012-07-21T13:40:39.627 に答える