考虑以下命名函数:
function f() {
return f.apply(this, arguments);
}
如果您正常调用此函数,则会按预期导致堆栈溢出。不是很有趣。所以让我们做一些魔术:
var g = f, f = alert;
现在,如果您调用f
它,它将只是alert
第一个参数。但是,如果您调用g
它,它仍然alert
是第一个参数。发生了什么?调用不应该g
导致堆栈溢出吗?
我的理解是,在函数内部f
(现在g
),变量f
不再绑定到f
. 它成为一个自由变量。因此f
,变量内部f
现在指向alert
。
为什么会这样?我希望命名函数中的函数名始终引用函数本身。我没有抱怨。它实际上很酷。我只是好奇。