javascript - 将命名函数存储在具有不同名称的变量中

标签 javascript function variables

考虑这段代码:

var x = function z(){
    console.log("called x");
}

x(); // will print out "called x"
z(); // ReferenceError!

因此,可以将命名函数存储在变量中,但我们仍然只能通过变量名调用函数。

这种行为有什么原因吗?为什么我们可以将命名函数存储在变量中?还有其他可能有用的场景吗?

最佳答案

当您像那样使用命名函数表达式 (NFE) 时,函数的名称仅在函数范围内:

var x = function z(){
    console.log(typeof z); // "function"
};
x();
console.log(typeof z);     // "undefined"

这是命名函数表达式和函数声明之间的重大区别之一:NFE 不会将函数的名称添加到表达式出现的范围;声明确实将函数的名称添加到声明出现的范围。 (它们也发生在不同的时间,等等;我简要介绍了创建函数的各种方式及其工作方式 in this other answer。)

这样做有几个原因:

  • 它允许函数在不依赖变量的情况下调用自身(通过其名称),适用于递归有用的情况。

  • 在 ES5 和更早版本中,它为您提供了一种为函数命名的方法(用于堆栈跟踪和类似的)。 (在 ES2015+ 中,大多数情况下,即使您使用匿名表达式,该函数也会有一个名称;该名称是根据表达式设置的。)

  • 在 ES2015+ 中,它允许您为函数指定一个不同于从表达式推断的名称。

关于javascript - 将命名函数存储在具有不同名称的变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45792417/

相关文章:

mysql - 从数据库传递 row.id 以在函数中返回 - Node.js

javascript - 将 Google map 街景小人放在标记下方

javascript - 在 Canvas 上绘制一个区域

从 R 中的函数返回结果

c - 函数中的 isdigit()

c - sizeof float array,不同的结果,有什么解决方法吗?

javascript - console.log() 显示变量值实际变化前的变化值

java - Processing sketch 在 Java 模式下工作正常,但在 Processing.js 下不行

javascript - 如何使用 jQuery 修改 JSON 内容

c - 错误 : redefinition of "a static variable" in C header files