我写了这个:
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;
不相同吗?
答案 0 :(得分:4)
没有。当你写:
alert=function(x){alert(x);};
你正在创建一个函数,当被调用时,它将无休止地调用它,直到它用完堆栈空间。您创建的“警报”符号将成为全局变量。在函数内部,在调用时,“alert”符号将被解析为该全局变量。
由于JavaScript的语义,每次调用函数时都会重新解析对函数中变量的引用。如果在定义该函数后,您执行了类似的操作:
var otherAlert = alert;
window.alert = function() { console.log("Hello world"); };
然后调用“otherAlert”将 not 导致错误,因为在那时“alert”将是一个不同的全局函数。