2016-01-21 168 views
5

功能名称在Javascript中,一个标准的方式来声明函数如下:var NAME = function NAME(){}; - 使用两次

var add = function(a,b){ 
    return a+b; 
}; 

然而,当我重复的语法右边的函数名,我没有得到任何错误,无论是。

var add = function add(a,b){ 
    return a+b; 
}; 

第二种情况是怎么回事?

+0

更多相关资讯:http://stackoverflow.com/questions/10081593/are-named-functions-or-anonymous-functions-preferred-in-javascript – Ankit

+1

[这个答案](HTTP:// stackoverflow.com/a/338053/4962525)很好地解释了你的问题。虚弱下来,后者是一个命名函数(这可能是有用的,例如在堆栈跟踪中,你会看到函数的名称而不是'匿名函数')。 – ROAL

回答

3

有在JavaScript中function关键字的两种用法:功能声明和功能表达。功能声明不允许关键字左侧的任何内容,例如

function add(a,b){ 
    return a+b; 
} 

,他们总是需要的名称,例如add。同时,您的实例调用其他类型,函数表达式,这需要一个名称(但可以被命名!)和总是需要的东西给他们留下,例如

var add = function(a,b){ 
    return a+b; 
}; 

甚至一个括号:

(function(a,b){ 
    return a+b; 
})(1,2); // 3 

所以,现在,我们已经有了一些词汇下来,你已经在你的第二个例子中得到的,reprinted-

var add = function add(a,b){ 
    return a+b; 
}; 

-是函数表达式(即,变量赋值为add),其函数碰巧是,命名为

现在,这个的目的是什么,命名为函数表达式?

明确是为了访问中的功能本身!根据MDN's documentation,

如果你想引用函数体内的当前函数,你需要创建一个命名函数表达式。 此名称仅限于函数体(范围)。

让我们重命名add这么我们可以谈论的东西不太容易混淆:

var abc = function xyz(a,b){ 
    return a+b; 
}; 

在上面,abc将在外部范围访问,而xyz是。同时,反之亦然:abc不是可以在内部范围访问,而xyz是。

+0

谢谢!这非常有帮助和简洁。 – Michael

1

此功能

var add = function add(a,b){ 
    return a+b; 
}; 

可以大致理解为

// the scope of outer `add` is here 
var add = function (a, b) { 
    var add = ...self... // something like that. the scope of this `add` is here 

    return a + b; 
} 
0

在这两种情况下,你都结束有一个名为add()功能。

但是,以下行为在此背景下很有趣。

var add = 1; 
function add() {}; 

add();  //<-- Error not a function 
+1

你想表明什么不清楚? –