我见过其他人使用以下模式.
var bar = function foo(){};
console.log(bar); // foo()
console.log(foo); // ReferenceError: foo is not defined
Run Code Online (Sandbox Code Playgroud)
但为什么?如果两者都被宣布,我可以看到这一点,但事实并非如此.原因是什么?
在调试应用程序时,当使用"命名"匿名函数时,更容易知道调用堆栈中调用的是什么.因此,这是一种为匿名函数命名以进行调试的方法.
试试这个并查看调试器中的callstack:
myDiv = document.getElementById("myDiv");
myDiv.onclick = function OnClick(){
debugger;
//do something
}
Run Code Online (Sandbox Code Playgroud)
正如其他人所提到的,使用示例中的第一个表单(一个命名的函数表达式)可以帮助调试,尽管最近浏览器内置开发人员工具的改进,这个论点变得不那么有说服力了.使用命名函数表达式的另一个原因是您可以将函数名称用作函数体内的变量,而不是ES5中现在已弃用的变量arguments.callee.
但是,在Internet Explorer <9中,命名函数表达式不正确且有问题,并且在您定位这些浏览器时通常应该避免使用.有关更多信息,请参阅Juriy Zaytsev关于该主题的优秀文章.