如何忽略(仅)jslint unparam块中的特定参数

时间:2015-11-04 16:46:06

标签: javascript angularjs jslint

我正在处理一个有角度的应用程序,并且我遇到了jslint抱怨未使用参数的问题。您可能知道,角度控制器需要" $ scope"作为控制器定义中的第一个参数传递。在我的具体情况下,我不想使用$ scope对象,而是使用" this"关键词。我可以使用$ scope或this来使代码工作,但由于其他我认为不相关的原因,我需要使用"这个"而不是" $ scope"。如果你必须知道原因,我很乐意提供一个链接,帮助解释为什么我要做出这个判断。

我发现这篇文章解释了如何关闭所有未使用参数的警告。

https://jslinterrors.com/unused-a

这很有效,但它并不理想,因为我不知道除了我已经知道的那个之外还有其他未使用的参数(并且还可以)。

我知道您可以打开unparam警告,然后再将其关闭,但这仍然无法解决我的问题,因为它是我的其余代码块希望允许jslint检查,而不是这个特定的变量($ scope)。我有很多这些类型的文件,不幸的是,它们都有类似的问题。这是我的代码:

/*globals angular, console, document */

(function() {
    'use strict';

    /**
     * @ngdoc function
     * @name app.controller:UserLogoutController
     * @description
     * Loggs out the current active user
     *
     */


    /*jslint unparam: true */
    angular.module('myAppName')
        .controller('UserLogoutController', ['$scope', 'userService', 'appConfig',
            function ($scope, userService, config) {

                this.logout = function() {

                    //logout logic goes here

                };
            }
            ]);

    /*jslint unparam: false */
    angular.module('myAppName')
        .directive('logoutbtn', function() {
            return {
                restrict: 'E',
                replace: true,
                templateUrl: './user/userLogout.html',
                controller: 'UserLogoutController',
                controllerAs: 'logout'
            };
        });

}());

这就像我能够达到我正在寻找的东西一样接近。对于它的价值,我还尝试将$ scope添加到顶部的globals部分,并且也不会抑制警告。我能够做的就是这样的事情

/*jslint unparam: "$scope" */

/*jslint unparam: [$scope] */

因此jslint只忽略这一个未使用的参数,但仍会警告其他任何未使用的参数。你能给出的任何建议都会很棒。如果您需要更多详细信息,请告诉我,我很乐意提供。在此先感谢!!!

1 个答案:

答案 0 :(得分:2)

两个答案。首先,如果您使用“Old JSLint”,第二个更容易,如果您使用今年早些时候发布的“New JSLint”并且最近离开了测试版。

旧JSLInt

  

“旧JSLint”的底线:如果没有黑客行为,你就无法做到这一点。

幸运的是,根据您使用JSLint的方式,黑客攻击可能非常简单。

我将使用the last version of JSLint before the "New JSLint" beta, from July 8, 2014

转到line 3177。从......

更改现有代码
if (!master.used && master.kind !== 'exception' &&
        (master.kind !== 'parameter' || !option.unparam)) {
    master.warn('unused_a');
} else if (!master.init) {
    master.warn('uninitialized_a');
}

......对于这个kludged版本......

if (!master.used && master.kind !== 'exception' &&
        (master.kind !== 'parameter' || !option.unparam)
        && "$scope" !== master.string // <<< Add your exception.
) {
    master.warn('unused_a');
} else if (!master.init) {
    master.warn('uninitialized_a');
}

......瞧。你已经完成了。

如果你想制作一个更复杂的案例,你有很多选择来添加选项。您可以通过破解JSLint的选项来添加新的unparam语法。您可以将一个可忽略的param名称数组设置为一个轻微的kludged全局对象,并使用indexOf来检查该更改的行而不是单个字符串比较。不管。

但如果这是一次性的交易,那么上面的黑客攻击就是快速而肮脏的方法。你明白了。 JSLint的优点在于,您可以使用与linting相同的语言自定义JavaScript。

同样,如何启动使用新代码取决于您如何调用JSLint。

新JSLint

如果你正在使用the latest jslint,那么你运气不错;您每次都可以使用the ignore convention跳过$scope。这是一个例子,使用您的代码作为起点:

/*jslint white:true, this:true */
/*globals angular, console, document */

(function() {
    'use strict';

    /**
     * @ngdoc function
     * @name app.controller:UserLogoutController
     * @description
     * Loggs out the current active user
     *
     */


    angular.module('myAppName')
        .controller('UserLogoutController', ['$scope', 'userService', 'appConfig',
            function (ignore, userService, config) {

                this.logout = function() {
                    console.log("logout logic goes here");
                };
            }
            ]);

    angular.module('myAppName')
        .directive('logoutbtn', function() {
            return {
                restrict: 'E',
                replace: true,
                templateUrl: './user/userLogout.html',
                controller: 'UserLogoutController',
                controllerAs: 'logout'
            };
        });

}());

ignore对于这个用例几乎是完美的,因为未使用的param是第一个参数,并且每个函数签名/声明只能使用ignore一次。