# 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 = 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 ...
Last Updated: 5/13/2023, 8:55:38 PM