通过本地包装函数,我看了很多关于从jslint中删除(必要的)未使用参数错误的stackoverflow答案:
/*jslint unparam: true*/
//my function with unused parameters
/*jslint unparam: false*/
但是当我尝试这样做时,我从JSLint得到以下错误:
Unexpected '/*jslint'.
我已尝试过各种各样的白色空间,例如:
/* jslint unparam: true */
/*jslint unparam : true */
/* jslint unparam: true*/
但是如果这样的改变有任何影响,那就是根本看不到jslint内联指令,而是保留未使用的错误。
经过一番玩弄,我怀疑问题是JSLint在处理过程中处于其他模式。有问题的函数位于自定义类声明中,类似于以下内容:
var myClass = CreateClass({
Constructor : function myClass()
{
//initialize
},
Parent : null,
Definition :
{
//member functions that will be copied into prototype,
// be added to custom chaining functionality, etc go here
/*jslint unparam: true*/
doSomething : function doSomething(inUnusedInterfaceParam, inUsedParam)
{
//do something with inUsedParam, but NOT inUnusedInterfaceParam
}
/*jslint unparam: false*/
}
});
无论我如何移动指令都无效。例如,我也尝试过各种变体:
doSomething : /*jslint unparam: true*/
function doSomething(inUnusedInterfaceParam, inUsedParam)
{
//do something with inUsedParam, but NOT inUnusedInterfaceParam
}
/*jslint unparam: false*/
这个问题只是导致我与JSLint建立真正的爱/恨关系的众多问题之一。我可能会在某些时候将它从我的构建中剥离出来以支持JSHint,但我还没有花时间去做那件事。与此同时,有没有办法让jslint闭嘴?什么条件导致jslint抱怨它自己的内联指令,正如它目前所做的那样?
答案 0 :(得分:2)
快速回答是JSLint directives operate at function scope(链接到jslint.js的当前版本),因此您尝试设置这些选项的地方并不适用。
// JSLint provides three inline directives. They look like slashstar comments,
// and allow for setting options, declaring global variables, and establishing a
// set of allowed property names.
// These directives respect function scope.
所以你是busting out on line 3243。这是一般背景。关键是(快速地)我们处于以{
开头的块的上下文中。这是来自JSLint.js的代码:
prefix('{', function (that) {
//...
while (next_token.id !== '}') {
indent.wrap = false;
edge();
if (next_token.string === 'get' && peek().id !== ':') {
//...
} else {
name = next_token;
i = property_name();
if (typeof i !== 'string') {
next_token.stop('missing_property'); // line 3243
}
advance(':');
spaces();
name.first = expression(10);
}
由于您正在处理{
代码,但它没有预料到或正在寻找指令,因此您的更改将会发生变化。
一开始我没有意识到,我最初(盲目地)试图将/*jslint unparam: true*/
向上移动,从弯曲的括号中移动到Definition :
附近,看看是否能让它快乐,但是得到:
Error (error): unexpected_a
/*jslint unparam: true*/
Unexpected '/*jslint'.
当我开始意识到这不是使用指令的有效时间时,JSLint的代码和注释证实了这一点。
现在我同意你[r隐含声明],能够在这里设置指令是有用的。如果你真的想要,你甚至可能会欺骗并对jslint代码这样做。但这并不是JSLint的构建方式。
只是为了 疯狂的邪恶 ,这是一个完全黑客,Crockford站在我的立方体上,要烧掉我的键盘并撕掉我的程序员'卡,让jslint做你想做的事。
转到line 3240。检查name
中存储的next_token是否在"/*jslint"
属性中有string
。如果是这样,完全劫持了jslint解析例程并将unparam
设置为true
(或者,更好的是,grok do_jslint()
,它设置了这些值。严重的是,尽管如此,我觉得粘贴这个很脏。
} else {
name = next_token;
//================================================
// HIJACK!!!!
//================================================
if (name.string === "/*jslint")
{
console.log && console.log("evil beginning");
advance();
// Completely cheating here. You'd need to grok do_jslint()
// (I don't yet) or at least parse the jslint line.
option.unparam = true;
// Splice out our reading the /*jslint line.
while (next_token.string !== "*/")
{
advance();
}
advance();
name = next_token;
}
//================================================
// Return control
//================================================
i = property_name();
if (typeof i !== 'string') {
// ....
然后在3413做同样的事情:
default:
//================================================
//================================================
if (next_token.string == "/*jslint")
{
console.log && console.log("evil ending");
// Same warning about super-kludging.
option.unparam = false;
while (next_token.string !== "*/")
{
advance();
}
advance();
}
else
{
next_token.stop('unexpected_a');
}
//================================================
//================================================
这里有一个pasteee,其中包含这些变化,还有一些非常可怕,永远不会重复,快速调试黑客。
我包含所有这些邪恶主要是为了表明你可以在这些地方解析jslint
指令,但是1.)JSLint显然不会和2.)你是必须花费大量时间才能全面正确地完成工作,而不仅仅是在这个特定的用例中。