javascript - JsHint (W083) : Don't make functions within a loop. - 使用 [].forEach();

标签 javascript jshint eslint

我收到这个错误:

JsHint (W083): Don't make functions within a loop.

使用以下代码时:

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 并且对于每个属性,我使用 三进制 设置 true/false 其他另一个对象属性运营商。

阅读我看到的一些文档:

JSHint and ESLint encounter a function expression in a for, while or do statement body.

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

最佳答案

Is this error legitimate one?

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

If yes, how to better re-write these lines?

如果可以,在循环之前声明函数并绑定(bind)一次或使用简单的闭包来避免显式绑定(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,这是一种常见的味道。您通常希望将其转换为 bool 值,!! 是惯用的 JS 方式:

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

如果可以,避免 for ... in 循环通常会让您的生活更美好,因此您可能也想重构它:

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

您也许可以进一步改进它。

关于javascript - JsHint (W083) : Don't make functions within a loop. - 使用 [].forEach();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31140514/

相关文章:

javascript - 使用字符串生成 HTML

javascript - Angular $resource 数据可以查看,但不能在代码中查看

javascript - 当我有效使用非点符号时 jshint "Better written in dot notation"的解决方案

javascript - Angularjs $routeProvider jshint 错误

javascript - Twitter Bootstrap Carousel 加载时自动播放

javascript - 游戏完成时触发 Javascript 事件

javascript - JsHint: "Expected an assignment or function call and instead saw an expression", Switch 语句

constants - 在 eslint 中禁用 Camel 大小写规则的检查

javascript - 使用 map 时出现 ESlint 错误 - 解决方法?

javascript - Eslint 规则在 import 中添加新行