jshint在按照Angular样式指南(John Papa或Todd Motto)的建议定义角度模块(或指令或工厂)时抛出错误。例如,对于像这样的控制器:
(function () {
'use strict';
angular
.module('myApp')
.controller('myAppCtrl', theController);
function theController() {...}
})();
... jshint抛出此错误:
'theController' was used before it was defined.
尽管出现这些错误,角度应用程序仍可正常运行但是我不知道为什么jshint抗议......
我错过了什么?我想知道jshint是否是角度代码质量的一个很好的评估者(尽管它包含在流行的包中作为生成器角度)或者是我做错了(虽然我的应用程序有效)。
提前致谢!
答案 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 :)");
}
})();