繁体   English   中英

为什么JavaScript中命名函数中的函数名称不再引用该函数本身?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM