变量NAME = function NAME (){ }; - 函数名称重复使用

5
在Javascript中,声明函数的一个标准方式如下:
var add = function(a,b){
   return a+b;
};

然而,当我在语法的右侧重复函数名称时,也不会出现错误。
var add = function add(a,b){
  return a+b;
};

第二种情况发生了什么?

更多相关信息请参见:https://dev59.com/Bmkw5IYBdhLWcg3wKnib - Ankit
1
这个答案很好地解释了你的问题。简单来说,后者是一个命名函数(例如在堆栈跟踪中,您将看到函数的名称而不是“匿名函数”)。 - ROAL
3个回答

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中),其函数恰好被命名
现在,这个命名函数表达式的目的是什么?
它专门用于访问函数内部!根据MDN文档

如果您想在函数体内引用当前函数,则需要创建一个命名函数表达式。然后该名称仅局限于函数体(作用域)中。

让我们重新命名您的add,以便我们可以更清晰地讨论事情:
var abc = function xyz(a,b){
    return a+b;
};

在上面的例子中,abc将在外部作用域中可访问,而xyz则不会。与此同时,反过来:abc将无法在内部作用域中访问,而xyz可访问。

谢谢!这非常有帮助且简明扼要。 - Gary

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

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