var NAME = function NAME(){}; - 功能名称使用两次

时间:2016-01-21 07:08:42

标签: javascript function

在Javascript中,声明函数的一种标准方法如下:

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

但是,当我在语法的右侧重复函数名称时,我也没有错误。

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

第二种情况发生了什么?

3 个答案:

答案 0 :(得分: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

所以现在我们已经有了一些词汇,你在第二个例子中得到了什么,重印 -

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

- 是一个函数表达式(即变量赋值为add),其函数恰好是名为

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

明确地访问本身的功能!根据{{​​3}},

  

如果要引用函数体内的当前函数,则需要创建一个命名函数表达式。 此名称仅对函数体(范围)是本地的。

让我们重新命名您的add,以便我们可以更轻松地谈论事情:

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

在上文中,abc可在外部范围内访问,而xyz 。同时,反之亦然:abc 可以在内部范围内访问,而xyz

答案 1 :(得分: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;
}

答案 2 :(得分:0)

在这两种情况下,您最终都拥有一个名为add()的函数。

但是在这种背景下,以下行为很有意思。

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

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