33

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

  /*jlsint xxx:true/false*/

指令来禁用某些与结构解释相反的小段代码的特定警告。

我使用的混淆代码使用了我不知道它们是否可以被禁用的构造。

例如:

for(L=(117.>

导致此消息:

Problem at line 1 character 57: A trailing decimal point can be confused with a dot '117.

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

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

我知道这个查询JSLint: control comments (selective ignore)但没有得到回答。

4

1 回答 1

2

如果你愿意,你可以自己将它添加到 JSLint,尽管那是边缘 Evil。

这是当前版本的一种快速而肮脏的方式:

我将采取的路线是劫持token函数的样式注释switch块。/*目前在第1276 行

case '/*':
    for (;;) {
        i = source_row.search(lx);
...

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

错误的 lint 失败代码示例:

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

如果我们找到/*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;

这很丑陋,但似乎正在工作。

现在这可能会导致问题。例如,如果您var在忽略并稍后使用它的部分中有声明,JSLint_Haked 将抱怨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);
}

所以那种东西可能会变得讨厌。

而且我只会在你被迫对所有内容进行 lint 的情况下使用它,但由于某种原因,你没有能力修复每个文件中的内容,尽管你确实有能力编辑它,奇怪的是,因为在这种情况下使用混淆代码。这整件事ignore很糟糕。

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

于 2015-03-12T16:16:11.430 回答