【问题标题】:var NAME = function NAME (){ }; - Function Name used twice变量名称 = 函数名称 (){ }; - 函数名称使用了两次
【发布时间】:2016-04-27 07:46:59
【问题描述】:

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

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

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

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

第二种情况是怎么回事?

【问题讨论】:

  • 更多相关信息在这里:stackoverflow.com/questions/10081593/…
  • This answer 很好地解释了您的问题。简单来说,后者是一个命名函数(这可能会有所帮助,例如在堆栈跟踪中,您会看到函数的名称而不是 anonymous function)。

标签: javascript function


【解决方案1】:

在 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),它的函数恰好被命名

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

它专门用于访问 inin 本身的函数!根据MDN's documentation

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

让我们重命名您的adds,这样我们就可以减少讨论的混乱:

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

在上面,abc 可以在外部范围内访问,而xyz 不能。同时,反之亦然:abc 将在内部范围内可访问,而xyz 在内部范围内。

【讨论】:

  • 谢谢!这非常有用且简洁。
【解决方案2】:

这个函数

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;
}

【讨论】:

    【解决方案3】:

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

    但在此背景下,以下行为很有趣。

    var add = 1;
    function add() {};
    
    add();     //<-- Error not a function
    

    【讨论】:

      猜你喜欢
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多