JSLint消息:未使用的变量


80

如果在这种情况下JSLint抱怨“ i”是未使用的变量,该怎么办:

var items = "<option selected></option>";
$.each(data, function (i, item) {
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

(i,item)是参数的必需顺序,我仅使用“ item”。

除了容忍未使用的变量或重写$ .each以使用索引之外,还有其他解决方案吗,我都不想这样做。

提前致谢。

更新:我很感谢所有建议,但是这段代码只是一个示例,向您展示我的意思,如果有的话,我很希望看到一个通用的解决方案。谢谢。


6
在这种特殊情况下this= itemapi.jquery.com/jQuery.each),因此您不必使用任何一个参数。但是这个问题可能应该从更一般的意义上回答。
格雷格,

如果我们能做的话真是太好了$.each(data, function (, item)
oscaralexander 2014年

许多人使用_未使用的参数,但是我看不出要JSLint专门忽略的方法_,尽管那真的很好。
David J.

Answers:


79

尝试:

var items = "<option selected></option>";
/*jslint unparam: true*/
$.each(data, function (i, item) {
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});
/*jslint unparam: false*/  // so that you still get warnings from other functions

+1。在类似的情况下,这对我来说效果很好,我能够将它放在受影响的行之前和之后。谢谢!
Ed Bayiates 2012年

4
由于您未使用i,并且正在使用jQuery的迭代器迭代对象的数组,因此可以使用“ this”:$.each([{a:0},{a:1},{a:2},{a:3}], function(){ console.log(this.a)})

3
这是最好的方法!/ * jslint unparam:true * /
Foxinni 2013年

1
删除功能:)

2
unparamJSLint不再支持。相反,它提供了ignore在下面的答案中描述的新关键字。
oyenamit 2015年

24

我认为这一定是新的:http : //www.jslint.com/help.html

“ JSLint引入了一个新的保留字:忽略”

因此,以上内容变为:

$.each(data, function (ignore, item) {

我=>忽略...太容易了。其余代码可以保持不变,浏览器满意,而JSLint满意


较早(错误)的答案:

要放置JsLint和浏览器,我需要使用:

function (d, i) {
        if (undefined !== win.undefined) {
            undefined(d);
        }
        return (i);
}

由于未定义不是函数,浏览器在“ undefined(d)”上崩溃。因此,如果我们在浏览器中,则“ undefined!== win.undefined”将跳过该行。


14
ignore如果相同功能具有多个未使用的参数,则这种抑制警告的新方法将失效。
oyenamit 2015年

您可以使用(参数,忽略,ignore1,ignore2,值,ignore3),至少在Mac的Webstorm上正在运行禁止广告警告
Paul N

1

您可以这样做:

var items = "<option selected></option>";
$.each(data, function () {
    var item = arguments[1];
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

...但是如果你问我,那可能更糟。


1
@Schroedinger-好的,是的。与JSLint总是一个权衡。您只需要自己决定。
尼克

8
修复了一个警告,并导致另一个“ JS Lint:使用命名参数” :)

1

以相当自我记录的方式摆脱警告的一种可能方法是使未使用的变量被使用,如下所示:

// Utility function in project scope:
function unusedVariables(/* Put all your deliberately unused variables here */) {
    // pass
}

// And then, later:
var items = "<option selected></option>";
$.each(data, function (i, item) {
    unusedVariables(i); //< This is the new and magical line
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

当然,现在您可以进入一种情况,将变量标记为未使用,但仍在某处使用它。另外,根据上下文,此方法可能太冗长。

该方法具有精确的优点。使用范围/*jslint unparam*/可能太广。


4
这可能会使JSLint的“空块”测试失败。
jokeyrhyme,2013年

4
尽管我建议不要使用它,但这个答案确实行得通。我将其归类为“解决方案比问题更严重”。
David J.

1
如果你们添加了一些有关此解决方案的缺点的详细信息,@superluminary和DavidJames,对其他读者会更有用。我对人们不喜欢这种解决方案没有问题,但是添加了一条评论,说那对任何人都没有帮助。:)
Magnus Hoff 2014年

6
抱歉Magnus,评论已删除。我不喜欢这种解决方案的原因是,您添加非语义代码只是为了欺骗特定验证器的特定版本以传递您的代码。这是一个hack,不会在代码中增加含义,并且不会老化。正确的解决方案是修改JSLint。
superluminary 2014年

@superluminary,谢谢您的详尽阐述:)
Magnus Hoff

1

使用void来明确表明您有意不使用该变量如何?

$.each(data, function (i, item, any, other, unused, vars) {
  void(i, any, other, unused, vars);
  items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

在预期会被覆盖但要显示签名的抽象函数中,或在模拟中要忽略参数但想要匹配模拟函数的签名的模拟中,这也很有用。


3
使用void似乎没有通过JSLint
xorcus 2013年

使用void原因Expected 'undefined' and instead saw 'void'undefined(i, any, other, unused, vars);虽然使用传递JSLint。
msenni 2014年

1

我将“ i”重命名为“未使用”。显然,它仍然会留下错误,但是我在列表中看到了该错误,并且知道我已经“检查”了该错误,并且可以接受。


这不是一个坏主意,但是如果您进行连续集成并且希望在允许代码合并之前先整理所有代码,那么如果您将警告视为错误,则此方法将无效。

1
答案所述,将未使用的变量重命名为“ ignore”,它将由JSLint进行验证。因此,“忽略”而不是“未使用”,就一切都准备好了(限制:在同一函数中仅支持一个未使用的变量)
Emilien


0

如果函数有多个未使用的参数,则可以使用“ ignore”,如下所示:

function (ignoreFoo, ignoreBar, baz) {
}

它必须简单地以保留字“ ignore”开头(ignore,ignoreFoo,ignoreBar等)。


这与PuZZleDucK的答案基本相同。如果您在已经有答案的情况下添加答案,尤其是当这些答案年龄较大且已经被投票赞成时,请确保您不只是重复另一个答案,或者,如果有所不同,请明确引用另一个答案并指出差异明显。谢谢!
法比奥说莫妮卡(Monica)恢复职权

2
使用以下代码(3个未使用的变量),只有第一个“忽略”通过JSLint验证,最后两个参数触发“未使用的'ignoreOne'”和“未使用的'ignoreTwo'”videos.forEach(function (ignore, i, ignoreOne, ignoreTwo)
Emilien

声明了'ignoreInterval',但从未读取其值。现在我得到了一个更长的错误:(
noob7 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.