警告 ESLint 规则下出现意外的未命名函数 func-names

新手上路,请多包涵

我的 eslint 版本是4.18.2,它会给出这样的警告:

意外的未命名函数

期待一个赋值或函数调用,而是看到一个表达式

以这种方式定义函数时:

  const farmerIds = a.reduce((function (hash) {
  return function (prev, curr) {
    !hash[curr.farmerId] && (hash[curr.farmerId] = prev.push(curr));
    return prev;
  };
}(Object.create(null))), []);

原文由 DZS 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 540
2 个回答

这是两个不同的问题……

意外的未命名函数

正如 Constantin 所指出的,这是 ESLint 规则 func-names

如果您不想禁用此规则,您可以为您的函数使用名称,如下所示:

 const farmerIds = a.reduce((function reducer(hash) {
  return function fn(prev, curr) {
    !hash[curr.farmerId] && (hash[curr.farmerId] = prev.push(curr));
    return prev;
  };
}(Object.create(null))), []);

或者,这是我个人推荐的,使用箭头函数:

 const farmerIds = a.reduce(
  (hash => {
    return (prev, curr) => {
      !hash[curr.farmerId] && (hash[curr.farmerId] = prev.push(curr));
      return prev;
    };
  })(Object.create(null)),
  []
);

期待一个赋值或函数调用,而是看到一个表达式

ESLint 抱怨这一行,它确实是一个表达式,而不是赋值或函数调用:

 !hash[curr.farmerId] && (hash[curr.farmerId] = prev.push(curr));

您可以将其重写为 if 语句:

 if (!hash[curr.farmerId]) {
  hash[curr.farmerId] = prev.push(curr);
}

修复两者

将上面的代码示例放在一起,这段代码应该在没有 ESLint 抱怨的情况下运行:

 const farmerIds = a.reduce(
  (hash => (prev, curr) => {
    if (!hash[curr.farmerId]) {
      hash[curr.farmerId] = prev.push(curr);
    }
    return prev;
  })(Object.create(null)),
  []
);

请注意,我还删除了第一个箭头函数主体周围的花括号,这是箭头的一个很好的附加功能,可以使代码更加简洁。

原文由 Patrick Hund 发布,翻译遵循 CC BY-SA 4.0 许可协议

另一种简单的方法是将 underscore 作为函数名称。例如:

const farmerIds = a.reduce((function _(hash) {...}(...);

原文由 tuq 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题