关于var NAME = function NAME (){ };function name使用两次

var NAME = function NAME (){ }; - Function Name used twice

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

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

但是,当我在语法右侧重复函数名时,我也不会得到任何错误。

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

第二个案子怎么了?


在javascript中,function关键字有两种用法:函数声明和函数表达式。函数声明不允许在关键字左侧使用任何内容,例如

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

它们总是需要一个名字,例如add。同时,您的示例调用其他类型的函数表达式,这些表达式不需要名称(但可以命名!)总是需要他们左边的东西,例如

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

甚至一个圆括号:

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

既然我们有了一些词汇量,你在第二个例子中得到了什么,再版。-

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

-是一个函数表达式(即变量赋值到add中),其函数恰好被命名。

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

它专门用于访问函数本身!根据MDN的文件,

If you want to refer to the current function inside the function body, you need to create a named function expression. This name is then local only to the function body (scope).

让我们重新命名你的add,这样我们就可以讨论一些不那么令人困惑的事情:

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

在上述情况下,abc将在外部范围内可访问,而xyz将不可访问。同时,反之亦然:abc在内部范围内是不可访问的,而xyz则是可访问的。


这个函数

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

可以大致解释为

1
2
3
4
5
6
// 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;
}


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

但是在这个背景下,下面的行为是有趣的。

1
2
3
4
var add = 1;
function add() {};

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