JSLint 消息:未使用的变量
Posted
技术标签:
【中文标题】JSLint 消息:未使用的变量【英文标题】:JSLint message: Unused variables 【发布时间】:2011-09-28 20:14:45 【问题描述】:如果 JSLint 抱怨“i”在这种情况下是一个未使用的变量,我该怎么办:
var items = "<option selected></option>";
$.each(data, function (i, item)
items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
);
(i, item) 是参数的必需顺序,我只使用“item”。
除了容忍未使用的变量或重写 $.each 以使用索引之外,还有其他解决方案吗,这两种解决方案我都不想这样做?
提前致谢。
更新:我感谢所有建议,但此代码只是一个示例,向您展示我的意思,我有兴趣查看通用解决方案(如果有)。谢谢。
【问题讨论】:
在这种特殊情况下this
= item
(api.jquery.com/jQuery.each),因此您不必使用任何一个参数。但这个问题可能应该在更一般的意义上回答。
如果我们能做到$.each(data, function (, item)
就太好了
Many people use _
for an unused parameter,但我 see no way to tell JSLint 特意忽略了 _
,虽然那真的很好。
【参考方案1】:
你可以这样做:
var items = "<option selected></option>";
$.each(data, function ()
var item = arguments[1];
items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
);
...但如果你问我,那可能会更糟。
【讨论】:
@Schroedinger -- 哦,是的,当然。这总是与 JSLint 的权衡。你只需要自己决定。 修复一个警告,导致另一个“JS Lint:使用命名参数”:)【参考方案2】:试试:
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。在类似的情况下,这对我很有用,我可以将它放在受影响的线之前和之后。谢谢! 因为你没有使用 i 并且你正在使用 jQuery 的迭代器迭代一个对象数组,你可以使用“this”:$.each([a:0,a:1,a:2,a:3], function() console.log(this.a))
这是最好的方法! /*jslint unparam: true*/
删除函数:)
JSLint 不再支持 unparam
。相反,它提供了以下答案中描述的新 ignore
关键字。【参考方案3】:
以一种相当自我记录的方式消除警告的一种可能方法是使用未使用的变量,如下所示:
// 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*/
可能过于宽泛。
【讨论】:
这可能会导致 JSLint 的“空块”测试失败。 这个答案确实“有效”,但我建议不要使用它。我将其归档在“解决方案比问题更糟糕”下。 如果你们在@superluminary 和 DavidJames 中添加了一些有关此解决方案的坏处的详细信息,对其他读者会更有帮助。我对人们不喜欢这个解决方案没有意见,但是添加评论说这对任何人都没有帮助。 :) 道歉马格努斯,评论已删除。我不喜欢这个解决方案的原因是因为您添加非语义代码只是为了欺骗特定验证器的特定版本以传递您的代码。这是一个 hack,它不会为代码增加意义,而且它不会很好地老化。正确的解决方案是修改 JSLint。 @superluminary 谢谢你的详细说明:)【参考方案4】:如何使用void
明确表示您故意不使用该变量?
$.each(data, function (i, item, any, other, unused, vars)
void(i, any, other, unused, vars);
items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
);
这在预期会被覆盖的抽象函数中也很有用,但您希望在其中显示签名,或者在模拟中,您忽略参数但希望匹配模拟函数的签名。
【讨论】:
使用 void 似乎没有通过 JSLint 使用void
会导致Expected 'undefined' and instead saw 'void'
。使用 undefined(i, any, other, unused, vars);
可以通过 JSLint。【参考方案5】:
我将“i”重命名为“未使用”。它仍然明显留下错误,但我在列表中看到它并且知道我已经“检查”了该错误并且可以接受。
【讨论】:
这不是一个坏主意,但是如果您进行持续集成并希望在允许合并代码之前对所有代码进行 lint,那么如果您将警告视为错误,这将不起作用。跨度> 如this回答中提到的,将未使用的变量重命名为“ignore”,它将被JSLint验证。所以“忽略”而不是“未使用”,一切就绪(限制:同一函数中仅支持一个未使用的变量)【参考方案6】:我认为这一定是新的:http://www.jslint.com/help.html
“JSLint 引入了一个新的保留字:ignore”
所以上面简单地变成了:
$.each(data, function (ignore, item)
i => 忽略...太容易了。其余代码可以保持不变,浏览器满意,JSLint 满意
之前的(错误的)答案:
为了安抚我需要使用的 JsLint 和浏览器:
function (d, i) if (undefined !== win.undefined) undefined(d); return (i);
由于 undefined 不是函数,浏览器在“undefined(d)”上崩溃。因此,如果我们在浏览器中,“undefined !== win.undefined”会跳过该行。
【讨论】:
如果同一个函数有多个未使用的参数,这种新的ignore
抑制警告方式就会失效。
您可以使用 (parameter, ignore, ignore1, ignore2, value, ignore3),至少在 Webstorm for Mac 上可以使用广告抑制警告【参考方案7】:
在这种特殊情况下,转换数组/对象http://api.jquery.com/jquery.map/(或http://api.jquery.com/map/?)是一个选项。
var items = "<option selected></option>" + $.map(data, function (item)
return "<option value='" + item.Value + "'>" + item.Text + "</option>";
).get().join('');
【讨论】:
【参考方案8】:如果函数有多个未使用的参数,你可以像这样使用"ignore":
function (ignoreFoo, ignoreBar, baz)
它必须简单地以保留字“ignore”开头(ignore、ignoreFoo、ignoreBar、...)。
【讨论】:
这与PuZZleDucK's answer基本相同。如果您在已有答案的情况下添加答案,特别是如果它们更老并且已经被投票,请确保您不只是重复另一个答案,或者,如果有差异,请明确引用另一个答案并指出区别很明显。谢谢! 使用下面的代码(3个未使用的变量)只有第一个“ignore”通过JSLint验证,最后两个参数触发“Unused 'ignoreOne'”和“Unused 'ignoreTwo'”videos.forEach(function (ignore, i, ignoreOne, ignoreTwo)
跨度>
'ignoreInterval' 已声明,但其值从未被读取。现在我得到一个更长的错误:(以上是关于JSLint 消息:未使用的变量的主要内容,如果未能解决你的问题,请参考以下文章
如何告诉 JSLint / JSHint 已经定义了哪些全局变量