JSlint - 在 for 循环中生成函数与评估函数
Posted
技术标签:
【中文标题】JSlint - 在 for 循环中生成函数与评估函数【英文标题】:JSlint - make function within for loop vs. evaluating function 【发布时间】:2016-05-01 21:19:42 【问题描述】:我有一个如下所示的函数:
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
【问题讨论】:
这个例子很好......因为您正在创建一个方法,调用它并在一行中同步地忘记它。尽管通常这是一种相当容易出错的方法:创建一个匿名函数,在循环中使用其本地范围之外的变量,可能会对您造成伤害。我相信 jslint 的规则只是不考虑一般规则的这种例外情况。 我想你想多了。您不会在循环中定义函数,因为它不是 DRY。为什么不 define the function earlier 作为 JSLint 请求?又名,“这个问题与the same topic 上的the usual stuff 有何不同?”我认为你被骗了(但我会等着听你 b4 投票结束)。 @ruffin 这里的主要区别是内联函数将在循环运行时执行,而不是之后。 JSLint 警告试图防止可能导致以后出现问题的闭包,这里介绍的内容很好,可以说是最正确的编写方式。您可以在没有内联回调的情况下重写此代码,但它看起来 (imo) 更糟糕,没有真正的好处。我会在这里使用注释来禁用 jslint 警告。 @JamesThorpe 我想你在这里提醒自己 Crockford 的名言,“JSLint 会伤害你的感情。”也就是说,Crockford 从来没有告诉你做明显错误的事情。和MDN disagrees with you in its own example ofsome
。 /shrug 我建议使用 MDN 自己的设置来定义 some
之外的函数并听取 JSLint 的建议。
@maioman 解释您所说的“立即被调用”是什么意思,以及它如何改变 JSLint 的警告。这如何改变错误?为什么不关注setup used in MDN that I referenced above,这也是 JSLint 的建议?
【参考方案1】:
通过将匿名函数声明包含在 for (var i in o)
中,您每次迭代时都会重新定义它,而不仅仅是一次,无论它是否“立即调用”——我要指出您对此的疏忽重新定义作为您要从代码中删除该构造的原因。
因此,您要么想摆脱for
,要么需要更早地定义函数。我将“更多”地接受 JSLint 的建议,并同时摆脱 for
。
JSLint.com 上的 lints 原样:
/*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 - 在 for 循环中生成函数与评估函数的主要内容,如果未能解决你的问题,请参考以下文章
在 JavaScript (JSLint) 中的 for 循环之外引用“this”元素