Javascript 警告:在ESLint规则下出现意外的未命名函数func名称

Javascript 警告:在ESLint规则下出现意外的未命名函数func名称,javascript,eslint,rules,Javascript,Eslint,Rules,我的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; }; }(O

我的
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))), []);

这是两个不同的问题

意外的未命名函数

正如康斯坦丁所指出的,这就是埃斯林特规则

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

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)),
  []
);

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

如果需要导出而不声明,可以按如下方式使用

export default () => {

// your code goes here

}

您可以按照以下说明禁用该规则:或者您可以提取未命名函数并将其置于常量下。我仍然收到警告“意外的未命名函数”。您是否尝试将
函数(哈希){}
提取到
const FUNCTIONNAME=function(哈希){}
中,然后在reduce中使用它。我已更新了我的答案,您有两个不同的ESLint警告感谢您开始修复
意外的未命名函数
,但正如一个提示一样,较新的ESLint会在带有花括号的主体的arrow函数参数周围抛出
预期的括号。(arrow parens)
第二个建议。我不得不将其更改为like
(hash)=>
,并删除您稍后添加的尾部参数。