考虑这段代码:
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/