3

我已经查看了许多关于通过本地包装函数从 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 inline 指令,而是保留了未使用的错误。

经过一番玩弄之后,我怀疑问题是 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 抱怨它自己的内联指令,就像它目前正在做的那样?

4

1 回答 1

2

快速回答

快速的答案是JSLint 指令在函数范围内运行(链接指向当前版本的 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.

过于详细的回答

所以你在第 3243 行被淘汰了。这是一般背景。关键是(很快)我们处于以 a 开头的块的上下文中{。这是来自 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*/,从波浪形的括号和 near 中移出,Definition :看看这是否会让它开心,但得到了:

Error (error): unexpected_a
     /*jslint unparam: true*/
    Unexpected '/*jslint'.

就在那时,我开始意识到这不是使用指令的有效时间,JSLint 的代码和注释证实了这一点。

现在我同意你[r 隐含的主张],能够在这里设置指令会很有用。如果你真的想要的话,你甚至可以对 jslint 代码作弊并这样做。但这根本不是 JSLint 的构建方式。


疯狂的邪恶

简直太邪恶了,这是一个完全 hacky,Crockford 站在我的立方体上,准备烧掉我的键盘并撕掉我的程序员卡,让 jslint 做你想做的事。

转到第 3240 行。检查存储的 next_tokenname是否"/*jslint"在其string属性中。如果是这样,请完全劫持 jslint 解析例程并设置unparamtrue(或者更好的是 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');
            }

//================================================
//================================================

这是一个包含这些更改的粘贴程序和一些更可怕的、永远不会重复的快速调试黑客。

我将所有这些邪恶包括在内主要是为了表明您可以jslint在这些地方解析指令,但是 1.) JSLint 显然没有和 2.) 您必须花费大量时间才能使其正常工作板,不仅仅是在这个特定的用例中。

于 2014-11-26T15:34:46.737 回答