jshint是否理解Angular?

时间:2014-10-09 21:40:26

标签: javascript angularjs jshint

jshint在按照Angular样式指南(John PapaTodd Motto)的建议定义角度模块(或指令或工厂)时抛出错误。例如,对于像这样的控制器:

(function () {
    'use strict';

    angular
        .module('myApp')
        .controller('myAppCtrl', theController);

    function theController() {...}

})();

... jshint抛出此错误:

'theController' was used before it was defined.

尽管出现这些错误,角度应用程序仍可正常运行但是我不知道为什么jshint抗议......

我错过了什么?我想知道jshint是否是角度代码质量的一个很好的评估者(尽管它包含在流行的包中作为生成器角度)或者是我做错了(虽然我的应用程序有效)。

提前致谢!

4 个答案:

答案 0 :(得分:18)

使用latedef属性并将其设置为false。这允许提升功能,IMO很好。但仍然报告悬挂变量,这是不好的IMO

答案 1 :(得分:15)

首先在你的"全局变量"中包含angular,例如:

"globals": { // Global variables.
        "jasmine": true,
        "angular": true,
        "browser": true,
        "element": true,
        "by":true,
        "io":true,
        "_":false,
        "$":false
    }

然后在从角度引用它之前移动函数定义。

(function () {
    'use strict';

    function theController() {...}

    angular
        .module('myApp')
        .controller('myAppCtrl', theController);
})();

答案 2 :(得分:5)

另一个让每个linter都满意的选择是声明一个变量,它首先保存函数,将它用作参数,然后定义它。

但我个人认为我不喜欢这里的流程。我觉得我更喜欢杰克的答案,但如果你对他的style guide感到沮丧的话,这就更接近爸爸似乎更喜欢的了。实际上,我不确定为什么这不是他推荐的,如果他真的希望功能在他们被使用后出现(他确实如此)。否则,你不能使用他的样式,在JSHint中将latedef设置为true - 或者在所有中设置为JSLint

(function () {
    'use strict';
    var theController;

    angular
        .module('myApp')
        .controller('myAppCtrl', theController);


    theController = function () {
        return "so jslint doesn't complain about empty blocks";
    };
}());

答案 3 :(得分:2)

您的代码工作,但jshint会尝试让您以非常严格的方式进行编码。至少它是一个良好的做法"在使用它们之前定义函数。正如我在上面的评论中所提到的,我认为较旧的javascript引擎从上到下执行(虽然无法确定并且无法进行测试) - 所以如果您要进行广泛的搜索 - 可能的支持你想听听jshint。

值得注意的是,如果您使用var关键字来定义函数,则会出现错误 - 最好通过示例解释:

这可行(http://jsfiddle.net/ryanwheale/kr8L825p/

(function() {
    try {
        foo();
    } catch(ex) {
        alert("ahhhhh, what's going on?!?!?\n\n" + ex.message);
    }

    function foo() {
        alert("I was hoisted to the top of this scope before execution :)");
    }
})();

...但这不是(http://jsfiddle.net/ryanwheale/kr8L825p/4/

(function() {
    try {
        foo();
    } catch(ex) {
        alert("ahhhhh, what's going on?!?!?\n\n" + ex.message);
    }

    var foo = function() {
        alert("I was hoisted to the top of this scope before execution :)");
    }
})();