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的建议呢?