JSLint似乎对函数排序很挑剔。
这很顺利:
function a() {
'use strict';
return 1;
}
function b() {
'use strict';
a();
}
虽然这会出现'a' is out of scope
错误消息:
function b() {
'use strict';
a();
}
function a() {
'use strict';
return 1;
}
这是设计的吗?我应该关心吗?如何在更大(更复杂)的情况下避免这种情况,在这种情况下可能无法始终为函数提供明确的顺序?
答案 0 :(得分:4)
JSLint / JSHint希望您在引用它们之前定义函数。但是,JavaScript并不关心,因为functions and variables are hoisted。
您可以更改代码样式,或者使用http://jshint.com/docs/options/#latedef
告诉linter忽略它/* jshint latedef:nofunc */
function b() {
'use strict';
a();
}
function a() {
'use strict';
return 1;
}
答案 1 :(得分:1)
@epascarello's link到this was discussed for JSHint这里绝对是绝对的,因为这不仅仅是一种风格问题。
让我们达到the excellent answer at that question的高点,因为它也适用于JSLint。*
定义函数有两种方法:函数声明和 功能表达。差异很烦人而且很小,所以让我们来吧 只是说这个稍微有点错误的事情:如果你像写作一样
function name() {}
,它是一个声明,当你写它时var name = function() {}
(或分配给返回的匿名函数,类似的东西),它是一个函数表达式。
bar(); //This won't throw an error
function bar() {}
foo(); //This **WILL** throw an error
var foo = function() {}
[强调我的-r]
它确实是worth reading all of the answer there,但它也值得强调这个JSLint错误不仅仅是关于风格,它会警告你关于功能的可能性错误。 Edge-case-y,当然,但这是一种有用的习惯。
我还要补充一点,你不应该在它们被定义之前以递归方式调用JavaScript中存在的函数。当我在这种情况下几次看到这个错误时,我一直很恼火,但是它几乎总是帮助显示一些代码味道,其中重构是有用的,而不是一个所有的地方函数jump是 required 。
如果你使用函数命名空间大量跳转,似乎你可能会在警告中作弊,我可能会在一两个案例中做得很尴尬。但是,我希望不是(在这两方面)。
*我很想将JSLint添加到这个问题中并称之为骗局,但不确定这是非常犹太的。