阻止jshint报告变量未用于特定局部变量?

时间:2015-06-05 18:24:52

标签: javascript jshint

在我的几个javascript文件上运行jshint时,我收到如下警告:

file.js: line X, col 93, 'fromParams' is defined but never used.
file.js: line X, col 72, 'toParams' is defined but never used.
file.js: line X, col 63, 'toState' is defined but never used.
file.js: line X, col 56, 'event' is defined but never used.

对于这样的事情:

$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
    // ... some code that doesn't use event, toState, toParams, or fromParams...
});

这种情况经常出现在各种类型的回调中 - 回调函数需要一定数量的参数,但函数中的代码并没有使用所有参数,因此jshint会抱怨它们。但参数必须在那里!

应该是在某些代码段中禁用此警告的方法,如下所示:

/*jshint -W098 */
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
/*jshint +W098 */

但是由于jshint中的错误,它无法正常工作,请参阅this open issue

也可以为所有功能禁用此警告:

/* jshint unused:false */

...但这是不可接受的,因为它会抑制函数中所有未使用变量的警告,我希望收到有关未使用的任何内容的通知对于函数参数我特别知道我不会使用。

我还有解决方法吗?我非常喜欢我的代码,不会触发任何linter警告,但就目前而言,jshint会报告几个"已定义但从未使用过的#34;警告,我不知道如何解决。

3 个答案:

答案 0 :(得分:7)

您可以使用函数顶部的/* jshint unused:vars */来抑制有关函数参数的警告,但仍会收到有关其他变量的警告。

答案 1 :(得分:3)

根据您的问题和意见,这应该适合您。

/*global console */

(function () {
    'use strict';

    var jshintUnused;

    (function () {
        return;
    }(jshintUnused));

    function blah(arg1, arg2, arg3) {
        jshintUnused = arg1;
        jshintUnused = arg2;
        console.log(arg3);
    }

    blah(null, null, 'Hello world');
}());

现在将上述方法与/*jshint unused: false*/

进行比较

jsHint unused

  

除此之外,此选项还会警告您未使用的全局   通过全局指令声明的变量。

     

这可以设置为vars,仅检查变量,而不是函数   参数,或严格检查所有变量和参数。该   default(true)行为是允许未使用的参数   然后是使用过的参数。

/*global console */

(function () {
    'use strict';

    var jshintUnused;

    (function () {
        return;
    }(jshintUnused));

    function blah(arg1, arg2, arg3, oops) {
        jshintUnused = arg1;
        jshintUnused = arg2;

        var hmm;

        console.log(arg3);
    }

    blah(null, null, 'Hello world');
}());

以上内容将知道oopshmm不应该被宣布,你会得到。 Warning: unused var: oops, hmm

/*global console */

(function () {
    'use strict';

    function blah(arg1, arg2, arg3, oops) {
        /*jshint unused: false */
        var hmm;

        console.log(arg3);
    }

    blah(null, null, 'Hello world');
}());

在上面jsHint忽略了对整个函数的未使用变量检查,你根本就不会收到任何警告。

我演示的方法允许您:

  

防止jshint报告变量未用于特定的局部变量?

我提出的另一个建议是使用arguments将要使用的参数分配给函数的本地变量。

/*global console */

(function () {
    'use strict';

    function blah() {
        var arg3 = arguments[2];

        console.log(arg3);
    }

    blah(null, null, 'Hello world');
}());

但根据您的意见,这似乎并不符合您的要求。

  

但参数必须在那里!

     

我并不热衷于删除这样的参数。首先,我认为是这样的   相当丑陋和你允许这样做的javascript漏洞,   但那只是我的意见。但更实际的是,如果我使用的话   最后一个参数我还需要其他参数。

最后,建议/*jshint unused: vars */

/*global console */

(function () {
    'use strict';

    function blah(arg1, arg2, arg3, oops) {
        /*jshint unused: vars */
        var hmm;

        console.log(arg3);
    }

    blah(null, null, 'Hello world');
}());

当我使用最新jsHint表单git repo尝试此操作时,我会

Four unused variables
8   hmm
6   oops
6   arg2
6   arg1

这不是我的预期,我原以为是。

Four unused variables
8   hmm

您可以将所有这些online直接粘贴到界面中来尝试。

答案 2 :(得分:0)

ESLint为这个用例提供了更好的选项,然后允许你不禁用这个非常重要的规则(它在重构一些代码时节省了我的调试时间)

  1. 默认情况下,如果使用了最后一个命名参数(选项{ "args": "after-used" }),它不会为第一个参数抛出警告,这很有用,因为您不会总是使用全部收到的回调参数

  2. 您可以为可以安全忽略的参数名称模式指定(选项{ "argsIgnorePattern": "^_" }

  3. http://eslint.org/docs/rules/no-unused-vars

    所以如果你有一些像

    这样的代码
    foo.bar(function (a, b, c, d) {
      var unusedLocal;
    
      console.log(c);
    });
    

    ESLint只会针对"d""unsusedLocal"

    发出警告

    如果你真的想离开" d"参数beacuse它是标准回调签名的一部分,可能会在以后使用,"argsIgnorePattern"会提供帮助。更好的是,它使您的整个代码更加明确无意义的未使用变量

    foo.bar(function (_a, _b, c, _d) {
      var unusedLocal;
    
      console.log(c);
    });
    

    这一次,ESLint只会针对"unsusedLocal"发出警告 您将首先了解在此代码中预期使用或不使用哪些参数。