首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

no-loop-func

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

代码语言:javascript
复制
for (var i = 0; i < 10; i++) {
    funcs[i] = function() {
        return i;
    };
}

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

letconst缓解这个问题。

代码语言:javascript
复制
/*eslint-env es6*/

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

在这种情况下,循环中创建的每个函数都会返回与预期不同的数字。

规则细节

提出这个错误是为了突出显示一段可能无法正常工作的代码,也可能表明对语言如何工作的误解。如果您没有修复此错误,您的代码可能会毫无问题地运行,但在某些情况下,它可能会出现意外情况。

此规则的错误代码示例:

代码语言:javascript
复制
/*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();
}

此规则的正确代码示例:

代码语言:javascript
复制
/*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 中引入。

资源

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com