[英]Why does the function name inside a named function in JavaScript no longer refer to the function itself?
考虑以下命名函数:
function f() {
return f.apply(this, arguments);
}
如果正常调用此函数,则将导致堆栈溢出。 不太有趣。 因此,让我们做一些魔术:
var g = f, f = alert;
现在,如果调用f
,它将仅alert
第一个参数。 但是,如果您调用g
,它将仍然alert
第一个参数。 发生了什么? 调用g
不应该导致堆栈溢出吗?
据我了解,在函数f
(现在为g
)中,变量f
不再绑定到f
。 它成为一个自由变量。 因此,在f
内部,变量f
现在指向alert
。
为什么会这样? 我希望命名函数中的函数名称总是引用函数本身。 我没有抱怨。 实际上很酷。 我只是好奇。
当您这样做时:
var g = f
这实际上与以下内容相同:
var g = function () {
return f.apply(this, arguments);
}
但是,由于您已重新分配f
因此它不再指向原始功能,因此现在指向alert
。 看起来它正在按设计工作。
如其他答案所述,它是设计好的。 基本上,除了吊装之外,声明还这样做:
var f = function () {
return f.apply(this, arguments);
}
也就是说, f
的值不是在声明时解析的,而是在函数调用期间解析的。 这就是为什么您看到自己所看到的。
但是有一种方法可以强制其按照您想要的方式运行:使用命名函数表达式 。 命名函数表达式看起来像一个声明,但不是由于该函数被声明为表达式。
例如,在下面:
var ff = function f () {
return f.apply(this, arguments);
}
f
的值在声明中受约束,并且不受重新分配的影响。 在命名函数表达式中,函数名称仅在表达式内部定义,因此其行为更像是闭包而不是变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.