2014-01-29 123 views
2
var a = function(){return true;} 
var a = function abc(){return true;} 

谁能给我解释一下这两者之间的区别是?两个不同的匿名函数声明之间的区别?

+0

的可能重复的[VAR functionName =函数(){} VS功能使用functionName(){}](HTTP://计算器.COM /问题/ 33 6859/var-functionname-function-vs-function-functionname) – matth

+0

这些函数中只有一个是匿名的。另一个是名为**的函数,称为'abc'。 – pete

+0

这是*不*这个问题的副本(虽然我相信这是一个重复的),如*的*两者的形式这里有'FunctionExpressions' - 一个只是有一个名字。 – user2864740

回答

4

的这里不同的是,这里

var a = function abc(){return true;} 

您命名一个匿名函数。该名称abc仅适用于该功能的内部范围。

UPDATE

尽管一些实现不尊重该公约......不要指望IE8与它的工作这是真的......

+1

至少,它应该是这样......一些实现搞砸然而:( – Cu3PO42

2

第二个功能是命名函数表达式。它对于递归可能是有用的,例如

// named 
var a = function abc(v) { console.log(v); return v>1 && abc(v-1) || v;} 
//             ^name abc is known 
    ,b = a 
a(3); //=> 3,2,1 
b(4); //=> 4,3,2,1 
a = function (v) {console.log('value = '+ v);}; 
b(3); //=> 3,2,1 

// versus 
var a = function (v) { console.log(v); return v>1 && a(v-1) || v;} 
//             ^using a here 
    ,b = a 
a(3); //=> 3,2,1 
b(4); //=> 4,3,2,1 
a = function (v) {console.log('value = '+ v);}; 
b(3); //=> 'value = 3' 
+0

注意,使用命名函数表达式是没有必要的递归 - 因为'了'是在内部功能的范围内都有效,你可以在你的例子中做'a(v-1)'。 – OverlappingElvis

+0

@OverlappingElvis:但请注意,这与函数的不同引用一起工作,在本例中为'b'引用。即使原来的'a'引用被覆盖,这种技术仍然可以继续工作,而如果你在'a'上再次出现问题,它会崩溃。 –

+0

@ScottSauyet谢谢,我想解释它,但你更快。 – KooiInc

3

的你的例子都只是函数表达式 - 也就是说,你要指定一个表达式(这恰好是一个函数)给一个变量。区别在于一个是匿名的,另一个是所谓的“命名函数表达式”。 http://kangax.github.io/nfe/对函数声明,表达式和命名表达式之间的区别有很好的概述。简短的版本:

  • 这些东西是,在大多数情况下,互换在很多情况下
  • 如果你做了很多的调试,已经命名,而不是匿名函数可以让你的调用栈更易于阅读
  • 然而,存在在涉及使用命名的函数的一定的JavaScript实现中的错误表达式
+0

只需添加到您的答案中,我发现对于较大的项目,为调试目的命名该函数(第二行)很方便(如果出现错误,Chrome控制台将显示名称),但随后会有一个缩小器/清理工通过并去除生产版本的名称。 – samanime

+0

好点 - 通过删除函数名称在缩小时不应该丢失任何东西。 – OverlappingElvis