Javascript JSLint";“超出范围”;由于函数排序而导致的错误?

Javascript JSLint";“超出范围”;由于函数排序而导致的错误?,javascript,jslint,Javascript,Jslint,JSLint似乎对函数排序很挑剔 这可以通过罚款: function a() { 'use strict'; return 1; } function b() { 'use strict'; a(); } 虽然这会给出一条“a”超出范围的错误消息: function b() { 'use strict'; a(); } function a() { 'use strict'; return 1; } 这是故意的吗?我应该在乎

JSLint似乎对函数排序很挑剔

这可以通过罚款:

function a() {
    'use strict';
    return 1;
}

function b() {
    'use strict';
    a();
}
虽然这会给出一条
“a”超出范围的错误消息:

function b() {
    'use strict';
    a();
}

function a() {
    'use strict';
    return 1;
}

这是故意的吗?我应该在乎吗?在更大(更复杂)的情况下,如何避免这种情况,在这种情况下,可能并不总是能够给函数一个明确的顺序?

JSLint/JSHint希望您在引用函数之前先定义函数。然而,JavaScript并不在意,因为

您可以更改代码样式,也可以使用

请参见这里真正的本质,因为这不仅仅是一个风格问题。

让我们来谈谈的要点,因为它也适用于JSLint*

定义函数有两种方法:函数声明和 函数表达式。这种差异既烦人又微小,所以让我们 只要说一句稍微有点错误的话:如果你是这样写的
函数名(){}
,它是一个声明,当您像
var name=function()

bar()//这不会引发错误

功能栏(){}

foo()//此**将**引发错误

var foo=function(){}

[强调地雷-r]

确实如此,但值得强调的是,这个JSLint错误不仅仅与样式有关,它还警告您可能存在功能错误。Edge-case-y,当然,但这是一个有用的习惯

我还要补充一点,在定义函数之前,不应该递归调用JavaScript中存在的函数。当我在这种情况下看到这个错误几次时,我很恼火,但它[几乎?]总是有助于显示一些代码味道,重构是有用的,而不是需要所有函数跳转的地方

如果使用函数名称空间跳转太多,似乎可以绕过警告,我可能会在一两个案例中尴尬地这样做。不过,我希望不会(在这两方面)



*我曾试图将JSLint添加到这个问题中,并称这个问题为dupe,但我不确定这是否很合乎犹太教义。

错误应该是这样的,
函数应该在使用它们之前定义。
“JSLint似乎对函数排序很挑剔。”-是的,确实如此。就这一点而言,“JSLint似乎很挑剔”也是正确的。一些Linter希望您在引用函数之前定义它们,但JavaScript并不在意。来自@epascarello的评论在这里是绝对必要的。此排序警告确实是一个值得解决的错误(请参阅下面的答案)。此外,您是否有一个“可能并不总是能够给函数一个明确的顺序”的示例?通常,正如我在下面所说的,这是一种值得检查的代码气味。值得注意的是,
latedef:nofunc
是一个仅限于JSHint的指令。@ruffin似乎暗示它也在JSLint
/*JSLint latedef:false*/
Hrm上。它现在在jslint.com上不起作用了,我也看不到。去年Crockford更新到ES6时,JSLint发生了很大的变化,但我(检查了一些日期)也改变了很多,正如那里所建议的那样。可能是在一个奇怪的版本中,或者这个答案是错误的。有趣的是,JSHint根本没有为我抱怨,只有JSLint抱怨。你接受的答案中建议的指令在JSLint中为你改变了什么吗?或者这里的答案就是简单地使用JSHint?我相信,遵循这条规则是值得的——不过,像往常一样,不要费心去清理你信任的第三方库!这通常是通往疯狂的捷径
/* jshint latedef:nofunc */
function b() {
    'use strict';
    a();
}

function a() {
    'use strict';
    return 1;
}