在我的几个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');
}());
上面会知道oops
和hmm
不应该被声明,你会得到。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为这个用例提供了更好的选择,这样你就可以不禁用这个非常重要的规则(它在重构一些代码时节省了我的调试时间)
-
默认情况下,如果使用最后一个命名的参数(选项
{ "args": "after-used" }
),它不会对第一个参数抛出警告,这很有用,因为您不会总是使用所有接收到的回调参数 -
你可以为那些可以被安全忽略的参数指定一个名称模式(选项
{ "argsIgnorePattern": "^_" }
)
如果你有一些像
这样的代码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"
发出警告第一眼就能知道代码中哪些参数需要使用,哪些不需要。