首页 > 解决方案 > 我有一个无循环功能问题,我不知道如何或是否应该费心解决

问题描述

目前,这并没有破坏我的代码中的任何内容,但我一直看到这是一个通常会导致严重问题的错误,但我不知道到底发生了什么或如何使错误消失。如果有人有任何建议,那就太好了。

错误:Function declared in a loop contains unsafe references to variable(s) 'i' no-loop-func

相关代码段:

      let i = 0;
      let interval = moment()
        .day(days[0] + frequency * i)
        .toDate();
      while (moment(endDate).isAfter(interval)) {
        days.map((day) =>
          selectedDays.push(
            moment()
              .day(day + frequency * i)
              .toDate()
          )
        );

        interval = moment()
          .day(days[0] + frequency * ++i)
          .toDate();
      }

标签: javascriptreactjsfor-loop

解决方案


遵循警告:

在循环中声明的函数包含对变量“i”的不安全引用

由于您的 while 循环只有一个函数声明(每次迭代),我们可以假设以下代码是问题所在:

(day) =>
  selectedDays.push(
    moment()
      .day(day + frequency * i)
      .toDate()
  )

箭头函数i内的引用会触发警告,因为 JavaScript linter 不知道何时/何地调用声明的函数。

查看no-loop-func规则示例时:

for (let i=10; i; i--) {
    var a = function() { return i; }; // OK, all references are referring to block scoped variables in the loop.
    a();
}

您可以看到可以通过使用块作用域变量来解决此警告。当应用于您当前的代码时,它可能如下所示:

while (moment(endDate).isAfter(interval)) {
  // store the value used by the function in a block-scoped constant
  const period = frequency * i;
  days.map((day) =>
    selectedDays.push(
      moment()
        .day(day + period)
        .toDate()
    )
  );
  // ...
}

map()如果你不打算使用返回值,你也应该避免使用。仅用于迭代使用forEach()for...of循环。

另一种选择是根本不声明函数,这可以通过使用for...of.

while (moment(endDate).isAfter(interval)) {
  for (const day of days) {
    selectedDays.push(
      moment()
        .day(day + frequency * i)
        .toDate()
    );
  }
  // ...
}

以上完全删除了函数声明。


推荐阅读