在Javascript中,声明函数的一种标准方法如下:
var add = function(a,b){
return a+b;
};
但是,当我在语法的右侧重复函数名称时,我也没有错误。
var add = function add(a,b){
return a+b;
};
第二种情况发生了什么?
答案 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