当前位置: 首页 > 知识库问答 >
问题:

JsHint(W083):不要在循环中创建函数。-使用[]. foreach();

宿鹏程
2023-03-14

我得到这个错误:

JsHint(W083):不要在循环中生成函数。

使用以下代码时:

for (var prop in cmd.properties) {
  Object.keys(meta[prop].data).forEach(function (rule) {
    rules.data[rule] = meta[prop].data[rule] ? true : false;
  }.bind(this));
}

基本上,我是在一个对象的属性meta[prop].data中循环,对于每个属性,我使用三元操作符设置其他对象属性的真/假。

阅读一些文档,我看到:

JSHint和ESLint在for、while或do语句体中遇到函数表达式。

  • 这个错误合法吗?
  • 如果是,如何更好地重写这些行?
  • 如果否,如何使用JsHint禁用此特定错误验证

共有1个答案

燕英奕
2023-03-14

这个错误合法吗?

是的,您正在循环中声明一个函数。最重要的是,bind可能会非常昂贵,因为它每次都必须创建一个新的词法作用域,并返回附加到该作用域的“新”函数。

如果是,如何更好地重写这些台词?

如果可以的话,在循环之前声明函数,或者绑定一次,或者使用简单的闭包来避免显式绑定调用:

var scope = this;
var ruleFunc = function (rule) {
  rules.data[rule] = meta[prop].data[rule] ? true : false;
}

for (var prop in cmd.properties) {
  Object.keys(meta[prop].data).forEach(ruleFunc);
}

不过,我没有看到您在函数中使用this的地方,因此您可以完全删除它:

var ruleFunc = function (rule) {
  rules.data[rule] = meta[prop].data[rule] ? true : false;
}

for (var prop in cmd.properties) {
  Object.keys(meta[prop].data).forEach(ruleFunc);
}

这两者都需要重构代码,因为您使用闭包从循环中获取prop变量。您可以使用bind来解决这个问题,并使用性能命中:

var ruleFunc = function (prop, rule) {
  rules.data[rule] = meta[prop].data[rule] ? true : false;
}

for (var prop in cmd.properties) {
  Object.keys(meta[prop].data).forEach(ruleFunc.bind(this, prop));
}

您还使用条件返回true/false,这是一种常见的气味。您通常希望将其转换为布尔值,使用 是惯用的JS方式:

rules.data[rule] = !!(meta[prop].data[rule]);

如果可以,请避免使用。。。在中,循环通常会让您的生活变得更好,因此您可能还需要重构它:

Object.keys(cmd.properties).forEach(function (prop) {
  Object.keys(meta[prop].data).forEach(function (rule) {
    rules.data[rule] = !!(meta[prop].data);
  });
});

你也许可以进一步改进。

 类似资料:
  • 问题内容: 我正在尝试在循环内创建函数: 问题在于所有功能最终都相同。这三个函数都没有返回0、1和2,而是返回2: 为什么会发生这种情况,我应该怎么做才能获得分别输出0、1和2的3个不同函数? 问题答案: 你在后期绑定方面遇到了问题-每个函数都i尽可能晚地查找(因此,在循环结束后调用时,i将设置为2)。 可以通过强制早期绑定轻松修复:更改为以下形式: 缺省值(右手i输入i=i是参数名的默认值,i左

  • 问题内容: 我正在努力使我们所有的JS代码都通过jslint传递,有时会进行大量调整,以便暂时获得旧版代码传递,以期稍后对其进行适当修复。 jslint抱怨一件事,我没有工作环境。那就是当使用这样的构造时,我们会收到错误“不要在循环内创建函数”。 此循环是经典继承的JS实现的一部分,在经典实现中,扩展现有类的类在调用扩展类的成员时保留扩展类的超级属性。 但是,我们还在循环中创建了函数的其他实例。

  • 我正在尝试制作一个宏,它将通过Excel表运行并通过一组行并为每行制作一个图表。 我有一些代码可以满足我的需要,但是当我需要为每一行创建一个单独的图形时,我会将它们放在一个图形上。 如果有人能帮我看看我错在哪里,那就太好了。

  • 我如何比较用户输入的这些数组呢?

  • 我是C#新手,在我创建的这个随机数猜谜游戏中,我很难理解哪里出错了。我试图在第30行的do time循环中添加一个random.next命令,当我运行程序时,它会说我的猜测太高或太低,我不明白出了什么问题。这是未完成的代码: 如果我删除numberTo猜测=随机。下一个(100)1;代码工作正常,但重复相同的随机数。 请帮忙。

  • 我对编码完全陌生,正在使用Python作为一个学校项目开发一个基于文本的游戏。用户必须通过键入“北”、“东”、“南”或“西”进入房间。如果方向无效,则应弹出错误消息,提示用户输入新方向。如果用户键入退出,游戏应该结束。 这个项目有一百万个问题,因为我发现我在编码方面很糟糕,但我想弄清楚的是,如果出现提示,如何让我的程序退出游戏。这是我的代码(它不是完整的代码,只是我到目前为止所拥有的代码。我试图一