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

Mic*_*ael 5 javascript function

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

var add = function(a,b){
   return a+b;
};
Run Code Online (Sandbox Code Playgroud)

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

var add = function add(a,b){
  return a+b;
};
Run Code Online (Sandbox Code Playgroud)

第二种情况发生了什么?

And*_*ong 3

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

\n\n
function add(a,b){\n    return a+b;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

他们总是需要一个名字,例如 add。同时,您的示例调用其他类型,函数表达式,它不需要名称(但可以命名!)并且 始终需要左侧的某些内容,例如您的

\n\n
var add = function(a,b){\n    return a+b;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

甚至是一个括号:

\n\n
(function(a,b){\n    return a+b;\n})(1,2); // 3\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我们已经有了一些词汇,你在第二个例子中得到的内容,重印\xe2\x80\x94

\n\n
var add = function add(a,b){\n    return a+b;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x94 是一个函数表达式(即变量赋值给add),其函数恰好名为

\n\n

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

\n\n

它明确用于访问其自身内部的函数!根据MDN 的文档

\n\n
\n

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

\n
\n\n

让我们重命名你的adds ,这样我们就可以不那么混乱地谈论事情:

\n\n
var abc = function xyz(a,b){\n    return a+b;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面,abc将在外部作用域中可访问,xyz不会。同时,反之亦然:在内部作用域中将不可访问,而可以abcxyz

\n