JSLint - 忽略代码段

Zha*_*ami 33 jslint

我有一个巨大的脚本传递JSLint(包括避免所有坏的部分).除了一个延伸,这是一个非常复杂的混淆代码嵌入在更大的上下文中.JSLint对这一部分产生了相当多的抱怨,我想为这段代码选择性地禁用它.我已经选择使用了

  /*jlsint xxx:true/false*/
Run Code Online (Sandbox Code Playgroud)

指令禁用某些微小代码的特定警告,这些代码执行与结构解释相反的操作.

我使用的混淆代码使用了我不知道是否可以禁用的构造.

例如:

for(L=(117.>
Run Code Online (Sandbox Code Playgroud)

导致此消息:

Problem at line 1 character 57: A trailing decimal point can be confused with a dot '117.
Run Code Online (Sandbox Code Playgroud)

当然,我知道我可以清理代码,但它是从混淆器发出的,我真的不想要清理混淆代码!

那么,有没有办法告诉JSLint完全忽略拉伸代码?

我知道这个查询JSLint:控制注释(选择性忽略)但它没有得到解答.

ruf*_*fin 2

如果您愿意,您可以自己将其添加到 JSLint 中,尽管这有点邪恶。

这是当前版本的一种快速但肮脏的方法:

我要采取的路线是劫持token函数的样式注释switch/*。当前位于第 1276 行

case '/*':
    for (;;) {
        i = source_row.search(lx);
...
Run Code Online (Sandbox Code Playgroud)

让我们更改它以查找看起来像/*ignore:true */单独一行的注释(尽管从技术上讲,true在这种情况下,一半可以位于该行的任何位置,但该/*ignore:false */必须单独位于一行,所以让我们假设这两者都成立) 。

错误的 lint 失败代码示例:

function spam()
{
    var sand = "sand";
/*ignore:true */
    var spud = "spud";
/*ignore:false */
    window.console.log(sand);
}
Run Code Online (Sandbox Code Playgroud)

如果找到/*ignore:true */,我们就跳过几行,直到找到该行的第一个字符为/*ignore:false */ with/*ignore:...的字符。直到那条错误的陈述单独出现在一行之前,我们忽略了一切

case '/*':
    // Opening /* has already been sliced.
    if (source_row.startsWith("ignore:true"))    {
        do  {
            if (console.log) { console.log(source_row) };
        } while (next_line() && !source_row.trim().startsWith("/*ignore:false"));
    }   else    {
        // Put in the code that was originally there
    }
    break;
Run Code Online (Sandbox Code Playgroud)

这很丑陋,但似乎有效。

现在这可能会导致问题。例如,如果您var在忽略并稍后使用它的部分中有一个声明,JSLint_Hacked 将抱怨myVar was used before it was defined.示例:

/*jslint white:true, sloppy:true, browser:true */
function spam()
{
    var sand = "spam";
/*ignore:true */
    var spud = "spud";
/*ignore:false */
    window.console.log(sand + spud);
}
Run Code Online (Sandbox Code Playgroud)

所以这类事情可能会变得令人讨厌。

我只会在你被迫愚蠢地检查所有内容的情况下使用它,但由于某种原因你没有能力修复每个文件中的内容,尽管你确实有能力编辑它,奇怪的是,在这种情况下,代码被混淆了。整件事ignore太肮脏了。

我需要在 JSLint 内部花费更多时间才能了解它的真正工作原理,但该next_line()功能似乎是非破坏性的。也就是说,您可以(并且应该)使用do_jslint()“真实”/*jslint ignore:true */样式指令在函数中处理此问题,但是在调用该函数时您必须处理副作用advance()。我在这里使用的 hack 更容易,但也丑陋。