JSLint"超出范围"功能排序导致的错误?

时间:2016-01-05 14:49:16

标签: javascript jslint

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;
}

这是设计的吗?我应该关心吗?如何在更大(更复杂)的情况下避免这种情况,在这种情况下可能无法始终为函数提供明确的顺序?

2 个答案:

答案 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;
}

请参阅https://stackoverflow.com/a/23916719/227299

答案 1 :(得分:1)

@epascarello's linkthis 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添加到这个问题中并称之为骗局,但不确定这是非常犹太的。