Jac*_*yef 3 javascript variables function
考虑一下这段代码:
var x = function z(){
console.log("called x");
}
x(); // will print out "called x"
z(); // ReferenceError!
Run Code Online (Sandbox Code Playgroud)
因此,可以在变量中存储命名函数,但我们仍然只能通过变量名称来调用函数.
这种行为有什么理由吗?为什么我们可以在变量中存储命名函数?还有其他可能有用的场景吗?
当您使用这样的命名函数表达式(NFE)时,函数的名称仅在函数的范围内:
var x = function z(){
console.log(typeof z); // "function"
};
x();
console.log(typeof z); // "undefined"
Run Code Online (Sandbox Code Playgroud)
这是命名函数表达式和函数声明之间的巨大差异之一:NFE不会将函数的名称添加到表达式出现的作用域中; 声明确实函数的名称添加到其中出现的声明范围.(它们也发生在不同的时间等等;我简要介绍了创建函数的各种方法以及它们在另一个答案中的工作方式.)
这样做有几个原因:
对于递归有用的情况,它允许函数调用自身(通过其名称)而不依赖于变量.
在ES5及更早版本中,它为您提供了一种为函数命名的方法(用于堆栈跟踪和类似).(在ES2015 +中,即使在大多数情况下使用匿名表达式,该函数也会有一个名称;名称是根据表达式设置的.)
在ES2015 +中,它允许您为函数提供与从表达式推断出的函数不同的名称.