no-loop-func
禁止循环中的函数(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=10; i; i--) {
// Bad, function is referencing block scoped variable in the outer scope.
var a = function() { return foo; };
a(
}
此规则的正确
代码示例:
/*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 ...
版本
该规则在 ESLint 0.0.9 中引入。