Javascript JSlint-for循环中的make函数与求值函数

Javascript JSlint-for循环中的make函数与求值函数,javascript,for-loop,jslint,Javascript,For Loop,Jslint,我有一个函数如下所示: 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会

我有一个函数如下所示:

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会抱怨

我知道用循环的重复表达式定义多个函数最终将创建多个函数,每个函数都保留最后一个重复表达式的值()

但是在这种情况下,由于我正在立即评估函数,我想不出
I
的实际值会发生变化的场景

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


通过将匿名函数声明封装在
for(var i in o){
中,您在每次迭代时都会重新定义它,而不仅仅是一次,无论它是否“立即调用”——我要指出,您对该重新定义的疏忽是您希望从代码中删除该构造的原因

因此,您要么要删除的
,要么需要更早地定义函数。我将“更多地”听取JSLint的建议,并删除

此链接在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);

这个例子很好…因为您正在创建一个方法,在一行中同步调用它并忘记它。虽然通常这是一种非常容易出错的方法:创建一个匿名函数,在循环中使用其局部范围外的变量,可能会对您造成伤害。我相信jslint的规则不会考虑呃,这是一般规则的例外情况。我认为你考虑得太多了。你不在循环中定义函数,因为它不是干巴巴的。为什么不按照JSLint的要求呢?也就是说,“这个问题和on有什么不同?”我想你是被愚弄了(但我等着听f/you b4投票结束)@ruffin这里的主要区别是内联函数将在循环运行时执行,而不是在循环运行后执行。JSLint警告试图防止可能导致后续问题的闭包,这里介绍的内容很好,可以说是最正确的编写方式。您可以在不使用他使用了内联回调,但这看起来(依我看)更糟,没有真正的好处。我会在这里使用注释来禁用jslint警告。@JamesThorpe我想这就是你提醒自己Crockford的话的地方,“jslint会伤害你的感情。”这就是说,Crockford从来不会告诉你做一些明显错误的事情。而且。/耸耸肩我建议使用MDN自己的设置来定义
some
之外的函数,并接受JSLint的建议。@maioman解释一下“立即被调用”是什么意思这是如何改变JSLint的警告的。这又是如何改变错误的呢?为什么不遵循JSLint的建议呢?