2016-01-25 56 views
3

我有一个功能,看起来像这样:的JSLint - 让内for循环功能与评价功能

function strip(o) { 
    for (var i in o) { 
     var test = basic.arr.some(function(x) {return x === i}); 
       //JSlint -- don't make functions within loop 
     if (test) 
     delete o[i]; 
    } 
    return o; 
} 

代码工作和JSLint的抱怨。我知道使用循环的重复表达式定义多个函数将最终创建多个函数,每个函数保留最后一个重复表达式的值(because each loop doesn't have a distinct scope);

但在这种情况下,由于我正在评估功能,我不能想到i的实际值会改变的情况;

我已经解决了使用forEach方法,但想知道为什么这最终会导致问题。

fiddle

+0

这非常例子就好了......既然你要创建一个方法,调用它在一个单行同步忘掉它。尽管通常这是一个相当容易出错的方法:创建一个匿名函数,在局部范围之外使用一个变量,并且在一个循环中,很可能会对你造成伤害。我相信jslint的规则只是不考虑一般规则的这种例外。 –

+0

我想你已经在想这个了。您不要在循环中定义函数,因为它不是干的。为什么不[先定义函数](http://stackoverflow.com/a/3038555/1028230)作为JSLint请求?又名,“这个问题与[通常的东西]不同(http://stackoverflow.com/questions/3037598/how-to-get-around-the-jslint-error-dont-make-functions-within-a -loop?rq = 1)on [同一主题](http://stackoverflow.com/questions/3927054/jslint-error-dont-make-functions-within-a-loop-leads-to-question-about- Java类?RQ = 1)?”我认为你有一个愚蠢(但我会等待听到你/ B4投票结束)。 – ruffin

+0

@ruffin这里的主要区别在于,内联函数将在循环运行时执行,而不是之后执行。 JSLint的警告是试图防止可能导致问题后来出现问题的关闭,这里介绍的很好,可以说是最正确的写法。你可以在不进行内联回调的情况下重写这段代码,但它看起来(imo)更糟糕,因为没有真正的好处。我会使用注释在这里禁用jslint警告。 –

回答

1

通过封闭在for (var i in o) {匿名函数声明,你每次迭代时重新定义,不只是一次,不管它是不是“立即调用” - 我想指出您将重新定义的监督视为您想从代码中删除该构造的原因。

所以你想摆脱for或者你需要更早的定义函数。我会采取更多的JSLint的建议,摆脱for

上JSLint.com这绒毛的是:

/*jslint white:true, devel:true */ 
var obj = { 
    a: true, 
    b: true, 
    c: true 
}; 

var basic ={ 
    arr: ['a', 'b'] 
}; 

function strip(o) { 
    "use strict"; 
    var test; 

    Object.keys(o).forEach(function (i) { 
    test = basic.arr.some(function (x) { return x === i; }); 
    if (test) { 
     delete o[i]; 
    } 
    }); 
    return o; 
} 
strip(obj); 
console.log(obj);