使用命名函数表达式的意义是什么?

4

我正在阅读一篇关于函数声明和函数表达式区别的博客。

它给出了以下两个例子。第一个称为“匿名函数表达式”,第二个称为“命名函数表达式”。

// anonymous function expression
var a = function(){
   return 3;
}

// named function expression
var b = function bar(){
   return 3;
}

我在Chrome的JS控制台中测试了这两个功能,结果如下:
a()
=> 3

b()
=> 3

bar()
=> bar is not defined

我的问题是:在第二个函数表达式声明中,“bar”的意义是什么?一般来说,为什么会使用命名函数表达式?


http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html,http://kangax.github.com/nfe/ - Bergi
2
@Juhana 不是一个好的重复,那里的答案(以及它标记为重复的那个)只涉及提升和堆栈跟踪。这里至少还有另一个答案提到了递归。然而,我找不到更好的重复... - bfavaretto
2个回答

7

有些人喜欢这样做是因为如果出现错误,你的函数就有名字了。这主要是个人喜好问题,也与你有多少次未命名函数出现错误有关。

通常你不会在 var 声明中看到它的使用,而是在声明回调函数时使用:

callbackFunction(function success() { ... }, function fail() { ... })

这样你就知道哪个参数是哪个,它们被标记了,如果其中一个失败,你就会得到一个精确的指示,告诉你是哪一个出了问题。


2
a.name === "" && b.name === "bar" - Prasanth
3
另一个原因是为了递归调用该函数。 - bfavaretto

7
var b = function bar(){
   return 3;
}
bar()
=> bar is not defined
标识符bar仅在函数内可用。请尝试
var b = function bar() {
    console.log(bar);
}
b();

为什么要使用命名函数表达式?

允许引用未分配给可达或常量变量的函数表达式,例如在IEFE中进行递归。

此外,命名函数在调试时显示不同,例如在调用堆栈(跟踪)或断点列表中。通常可以使用(命名)函数声明代替函数表达式,请参见http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接