防止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中的一个bug,它不能工作,参见这个开放问题。

也可以对整个函数禁用此警告,如下所示:

/* jshint unused:false */

…但这是不可接受的,因为它会抑制对函数中所有未使用变量的的警告,并且我想要收到关于任何未使用的通知,除了对于我明确知道我不会使用的函数参数。

有办法让我解决这个问题吗?我非常希望我的代码不触发任何linter警告,但就目前而言,jshint将报告几个"定义但从未使用"的警告,我不知道如何修复。

您可以在函数顶部使用/* jshint unused:vars */来抑制关于函数参数的警告,但仍然可以获得关于其他变量的警告。

根据你的问题和评论,这应该可以为你工作。

/*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未使用

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

可以设置为vars,只检查变量,不检查函数参数,或严格检查所有变量和参数。的默认(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

您可以通过将它们直接粘贴到界面中来在线尝试所有这些

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"参数,因为它是标准回调签名的一部分,以后可能会使用,"argsIgnorePattern"会帮助你。更好的是,它使你的整个代码更明确地显示有意未使用的变量

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

这一次,ESLint只会对"unsusedLocal"发出警告第一眼就能知道代码中哪些参数需要使用,哪些不需要。

最新更新