覆盖函数会导致过多的递归

时间:2012-07-21 13:39:15

标签: javascript variable-assignment overwrite

我写了这个:

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

firefox的控制台显示过多的递归

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

完美无缺。

为什么第二种方式起作用而第一种方式不起作用?

foo=foo;有效。 alert=function(x){alert(x);};foo=foo;不相同吗?

1 个答案:

答案 0 :(得分:4)

没有。当你写:

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

你正在创建一个函数,当被调用时,它将无休止地调用它,直到它用完堆栈空间。您创建的“警报”符号将成为全局变量。在函数内部,在调用时,“alert”符号将被解析为该全局变量。

由于JavaScript的语义,每次调用函数时都会重新解析对函数中变量的引用。如果在定义该函数后,您执行了类似的操作:

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

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