javascript - 我有一个无循环功能问题,我不知道如何或是否应该费心解决
问题描述
目前,这并没有破坏我的代码中的任何内容,但我一直看到这是一个通常会导致严重问题的错误,但我不知道到底发生了什么或如何使错误消失。如果有人有任何建议,那就太好了。
错误: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();
}
解决方案
遵循警告:
在循环中声明的函数包含对变量“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()
);
}
// ...
}
以上完全删除了函数声明。
推荐阅读
- flutter - 如何在颤动中返回 SliverAppBar 和 SliverList 的组合
- java - Lombok 可以排除该值但仍打印字段名称吗?
- python - 仅使用 if 语句查找字符串的第一个元音
- matlab - matlab中遗传算法的优化
- python - 如何配置多个 PUB/单个 SUB python ZMQ Ubuntu
- python - sync_diff() 无法保持排序/顺序
- django - Django elasticsearch dsl完成字段问题
- docker - Docker:`RUN apt update`上的`exec format error`
- r - 使用百分比创建马赛克图
- python - Python无限while循环在按下ctrl-c之前不应该暂停