考虑这段代码:
var x = function z(){
console.log("called x");
}
x(); // will print out "called x"
z(); // ReferenceError!
因此,可以在变量中存储命名函数,但我们仍然只能通过变量名来调用该函数。
这种行为有什么原因吗?为什么我们可以将命名函数存储在变量中?还有其他场景可能有用吗?
当您使用这样的命名函数表达式(NFE)时,函数的名称仅在范围内within功能:
var x = function z(){
console.log(typeof z); // "function"
};
x();
console.log(typeof z); // "undefined"
这是命名函数表达式和函数声明之间的重大区别之一:NFE 不会将函数的名称添加到表达式出现的范围中;NFE 不会将函数的名称添加到表达式出现的范围中。一份声明does将函数的名称添加到声明出现的范围中。 (它们也发生在不同的时间等;我总结了创建函数的各种方法以及它们如何工作在另一个答案中 https://stackoverflow.com/a/22173438/157247.)
这样做有几个原因:
对于递归有用的情况,它允许函数调用自身(通过其名称)而不依赖变量。
在 ES5 及更早版本中,它为您提供了一种为函数命名的方法(用于堆栈跟踪等)。 (在 ES2015+ 中,即使大多数情况下使用匿名表达式,函数也会有一个名称;名称是根据表达式设置的。)
在 ES2015+ 中,它允许您为函数指定一个与从表达式推断的名称不同的名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)