考虑这段代码:
var x = function z(){
console.log("called x");
}
x(); // will print out "called x"
z(); // ReferenceError!
因此,可以在变量中存储命名函数,但我们仍然只能通过变量名调用该函数。
这种行为有什么理由吗?为什么我们可以在变量中存储命名函数?还有其他可能有用的场景吗?
答案 0 :(得分:8)
当您使用这样的命名函数表达式(NFE)时,函数的名称仅在 函数的范围内:
var x = function z(){
console.log(typeof z); // "function"
};
x();
console.log(typeof z); // "undefined"

这是命名函数表达式和函数声明之间的重大区别之一:NFE不会将函数的名称添加到表达式出现的范围中;声明 将声明的名称添加到声明出现的范围。 (它们也发生在不同的时间等等;我简要介绍了创建函数的各种方法及其工作方式in this other answer。)
这样做有几个原因:
它允许函数调用自身(通过其名称),而不依赖于变量,适用于递归有用的情况。
在ES5及更早版本中,它为您提供了一种为函数命名的方法(用于堆栈跟踪等)。 (在ES2015 +中,即使您在大多数情况下使用匿名表达式,该函数也会有一个名称;该名称是根据表达式设置的。)
在ES2015 +中,它允许您为函数提供与从表达式推断的名称不同的名称。
答案 1 :(得分:3)
只需将函数z
分配给变量x
,就像这样:
function z () {
console.log("called x");
}
var x = z;
x(); // will print out "called x"
z(); // will print out "called x"