Eslint
规则 | Rules

no-loop-func

禁止循环中的函数(no-loop-func)

在循环内编写函数往往会导致错误,因为函数在循环周围创建闭包。例如:

for (var i = 0; i < 10; i++) { funcs[i] = function() { return i; }; }

在这种情况下,您会希望在循环中创建的每个函数都返回一个不同的数字。实际上,每个函数返回10,因为这是i范围中的最后一个值。

letconst缓解这个问题。

/*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 中引入。

资源