# no-loop-func
禁止在循环语句中包含不安全引用的函数声明
由于函数在循环周围创建闭包的方式,在循环中编写函数往往会导致错误。例如:
for (var i = 0; i < 10; i++) {
funcs[i] = function() {
return i;
};
}
在这种情况下,您会期望在循环中创建的每个函数都返回不同的数字。实际上,每个函数都返回 10,因为这是作用域中 i
的最后一个值。
let
或 const
缓解了这个问题。
/*eslint-env es6*/
for (let i = 0; i < 10; i++) {
funcs[i] = function() {
return i;
};
}
在这种情况下,循环中创建的每个函数都按预期返回不同的数字。
# 规则详情
引发此错误是为了突出显示一段可能无法按预期工作的代码,并且还可能表明对该语言的工作方式存在误解。如果您不修复此错误,您的代码可能会毫无问题地运行,但在某些情况下,它可能会出现意外行为。
此规则不允许循环中包含不安全引用的任何函数(例如,从外部范围修改变量)。
此规则的错误代码示例:
/*eslint no-loop-func: "error"*/
/*eslint-env es6*/
for (var i=10; i; i--) {
(function() { return i; })();
}
while(i) {
var a = function() { return i; };
a();
}
do {
function a() { return i; };
a();
} while (i);
let foo = 0;
for (let i = 0; i < 10; ++i) {
//Bad, `foo` is not in the loop-block's scope and `foo` is modified in/after the loop
setTimeout(() => console.log(foo));
foo += 1;
}
for (let i = 0; i < 10; ++i) {
//Bad, `foo` is not in the loop-block's scope and `foo` is modified in/after the loop
setTimeout(() => console.log(foo));
}
foo = 100;
此规则的正确代码示例:
/*eslint no-loop-func: "error"*/
/*eslint-env es6*/
var a = function() {};
for (var i=10; i; i--) {
a();
}
for (var i=10; i; i--) {
var a = function() {}; // OK, no references to variables in the outer scopes.
a();
}
for (let i=10; i; i--) {
var a = function() { return i; }; // OK, all references are referring to block scoped variables in the loop.
a();
}
var foo = 100;
for (let i=10; i; i--) {
var a = function() { return foo; }; // OK, all references are referring to never modified variables.
a();
}
//... no modifications of foo after this loop ...