JSLint未使用参数的动态更改

时间:2014-03-30 15:06:12

标签: jslint unused-variables

通过本地包装函数,我看了很多关于从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抱怨它自己的内联指令,正如它目前所做的那样?

1 个答案:

答案 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.)你是必须花费大量时间才能全面正确地完成工作,而不仅仅是在这个特定的用例中。