将函数名添加到对象声明中有什么好处?

What would be the benefit of adding a function name to an object declaration?

例如,当我将一个函数指定为对象声明的属性时,我的Webpack 加载器babel-loader 会自动添加一个函数名吗?例如,假设我有以下比较函数:

var utils = {
  compare: function (a, b) {
    if (parseFloat(a[0]) - parseFloat(b[0]) === 0) {
      return parseFloat(a[1]) - parseFloat(b[1]);
    }
    else {
      return parseFloat(a[0]) - parseFloat(b[0]);
    }
  }
}

Webpack 会将其编译为以下内容:

var utils = {
  compare: function compare(a, b) {

    if (parseFloat(a[0]) - parseFloat(b[0]) === 0) {
      return parseFloat(a[1]) - parseFloat(b[1]);
    } else {
      return parseFloat(a[0]) - parseFloat(b[0]);
    }
  }
}

[compare: function (a,b) 已更改为 compare: function compare (a,b)]

为调试和递归目的命名所有函数只是一个好习惯。 Babel 使用加载程序在转译后的代码上执行此操作,这不是 Webpack 的工作。

您在问题中发布的代码确实没有什么好处。但是,要递归调用匿名函数,您需要为其命名(至少在 javascript 的较新版本中)。这种语法有一个名字。它被称为 named function expression.

在旧版本的 javascript 中,arguments 对象有一个名为 .callee 的 属性 引用该函数。这可用于递归到匿名函数中:

var sum = function(numbers){
    var n = numbers.pop();
    if (numbers.length) {
        return n + arguments.callee(numbers);
    }
    return n;
}

arguments.callee 属性 已在 ES5 中弃用。因此,在 javascript 的当前(和更新)版本中,您需要使用命名函数表达式对匿名函数进行递归:

var sum = function s (numbers){
    var n = numbers.pop();
    if (numbers.length) {
        return n + s(numbers);
    }
    return n;
}

请注意,根据规范,命名函数表达式的名称对函数本身是私有的。因此,在没有错误的 javascript interpreter/compiler 中,上面的第二个示例不应在匿名函数 sum() 之外创建名为 s() 的函数。然而,一些 ES4 实现(较旧的浏览器)已知会被破坏并且会创建 s()sum()。除了名称泄漏外,命名函数表达式语法适用于过去 10 年左右发布的所有浏览器。