Javascript jshint理解Angular吗?
jshint在按照angular style Guide(by或)的建议定义角度模块(或指令或工厂)时抛出错误。例如,对于这样的控制器:Javascript jshint理解Angular吗?,javascript,angularjs,jshint,Javascript,Angularjs,Jshint,jshint在按照angular style Guide(by或)的建议定义角度模块(或指令或工厂)时抛出错误。例如,对于这样的控制器: (function () { 'use strict'; angular .module('myApp') .controller('myAppCtrl', theController); function theController() {...} })(); 。。。jshint抛出此错误: '
(function () {
'use strict';
angular
.module('myApp')
.controller('myAppCtrl', theController);
function theController() {...}
})();
。。。jshint抛出此错误:
'theController' was used before it was defined.
尽管存在这些错误,angular应用程序仍能完美工作。但是我不知道为什么
我错过了什么?我想知道jshint是否是angular代码质量的良好评估工具(尽管它作为GeneratorAngular包含在流行的包中),还是我做错了什么(尽管我的应用程序可以工作)
提前谢谢 首先,在“全局变量”中包含角度,例如:
"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);
})();
您的代码应该可以工作,但是jshint将尝试让您以非常严格的方式编写代码。至少,在使用函数之前定义它们是一种“良好实践”。正如我在上面的评论中提到的,我认为较旧的javascript引擎是自上而下执行的(虽然不能肯定,也不能测试)——因此,如果您想要获得尽可能广泛的支持,您将需要听取jshint
这里值得注意的是,如果您使用var
关键字来定义函数,您将得到一个错误-最好通过示例来解释:
这是有效的()
。。。但这不是()
使用
latedef
属性并将其设置为false
。这允许提升功能,IMO认为这很好。但是仍然报告了变量的提升,这在IMO中是不好的,因此另一个让每个linter都高兴的选项是,首先声明将保存函数的变量,将其用作参数,然后定义它
但就我个人而言,我不确定我是否喜欢这里的流动。我想我更喜欢杰克的答案,但如果你不喜欢他的话,这更接近爸爸喜欢的答案。事实上,如果他真的希望函数在使用后出现(他确实这样做了),我不知道为什么这不是他的建议。否则,在JSHint或JSLint中将latedef
设置为true时,就不能使用他的样式
将控制器的功能定义移动到角度代码上方。现代的JS引擎在执行之前会向前看,并找到您的函数定义,但较旧的引擎是从上到下执行的(我认为“严格”模式也需要这样做)。我认为函数提升将使这不再是一个问题jshint理解JavaScript*吗。AngularJS是JAVASCRIPT。没有别的了,误差不是特定于角度的。显然,您已经启用了,这会警告您依赖的代码。禁用该选项或调整代码中语句的顺序以删除依赖项。@self在本例中,
Angular[style]!==JavaScript
。John Papa(参见)有一个明显的缺点,即在函数用作参数后需要定义函数。这意味着Papa认可的角度样式在JSHint中将latedef
设置为true时不起作用,并且永远不会通过JSLint。我可能会改变一下措辞(“约翰·帕帕·格罗克·杰斯林特吗?”),但大卫的问题是公平的。这不是一个很好的标题,但是一个公平的问题。问题解决了!!谢谢你的回答@杰克裂土器,它的工作只是移动定义的功能,正如你所建议的。无论如何,我还按照您的建议在.jshintrc文件中的globals中添加了“angular”。再次感谢!问题是angular style guide提倡一种定义下面的函数的样式,然后将它们绑定到一个公共端点(即this.foo=internalFoo
…topfunction internalFoo(){}
,在底部)为什么不在返回到首选流并定义它之前对Crockford做出让步呢?然后,每个人[似乎都很高兴!]我更喜欢把驱动意图的代码放在最上面,放在最上面。将函数和接口放在上面可以做到这一点。你可以用你喜欢的任何方式做这件事。但这就是我这么做的原因:当我打开文件时,让它能够立即识别它的功能和使用方法。细节如下不,我明白了。我是这么说的。您有一行额外的小代码来声明函数,以使linters满意,然后所有的“细节都跟在前面”。你的风格指南很有分量,但它与门楣的冲突引起了一些类似的问题。声明行比这个问题更好地保留了您的理想,并将停止lint冲突。2、等。我明白了,但我看不出有什么理由在可以设置latedef的时候为var在顶部添加额外的行。这一切都是基于我不觉得吊装功能不好;谢谢只是别指望会喜欢它
(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 :)");
}
})();
(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 :)");
}
})();
(function () {
'use strict';
var theController;
angular
.module('myApp')
.controller('myAppCtrl', theController);
theController = function () {
return "so jslint doesn't complain about empty blocks";
};
}());