2

我写了这个:

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

并显示了Firefox的控制台Too much recursion

和:

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

完美运行。

为什么第二种方法有效而第一种方法无效?

并且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"); };

然后调用“otherAlert”不会导致错误,因为此时“alert”将是一个不同的全局函数。

于 2012-07-21T13:40:39.627 回答