gpt4 book ai didi

JSLint 未使用的参数不会动态变化

转载 作者:行者123 更新时间:2023-12-02 09:50:55 26 4
gpt4 key购买 nike

我查看了许多关于通过本地包装函数来消除 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 提示它自己的内联指令,就像它目前正在做的那样?

最佳答案

快速回答

简单的回答是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 。这是一般背景。关键是(很快)我们处于以 { 开头的 block 的上下文中。以下是 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 的代码和注释证实了这一点。

现在我同意你的观点[隐式声明],能够在此处设置指令会很有用。如果您确实愿意,您甚至可以作弊并对 jslint 代码执行此操作。但这根本不是 JSLint 的构建方式。

<小时/>

疯狂的邪恶

只是为了疯狂邪恶,这完全是黑客行为,Crockford 站在我的立方体旁边,准备烧毁我的键盘并撕毁我的程序员卡,这样就能让jslint 做你想做的事。

转到line 3240 。检查存储在 name 中的 next_token 的 string 属性中是否有 "/*jslint"。如果是这样,完全劫持 jslint 解析例程并将 unparam 设置为 true (或者更好的是,理解 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.) 您必须采取需要大量的时间来使其全面正确地工作,而不仅仅是在这个特定的用例中。

关于JSLint 未使用的参数不会动态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22745586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com