【问题标题】:JSLint "out of scope" error due to function ordering?由于功能排序,JSLint“超出范围”错误?
【发布时间】:2016-04-09 10:38:27
【问题描述】:

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

这是设计使然吗?我应该关心吗?在更大(更复杂)的情况下,如何避免它可能并不总是可以给函数一个明确的顺序?

【问题讨论】:

  • 错误应该类似于Functions should be defined before using them
  • "JSLint 似乎对函数排序很挑剔。" - 是的。就此而言……“JSLint 似乎很挑剔”也是如此。
  • 一些 linter 希望你在函数被引用之前定义它们,但 JavaScript 不在乎。
  • @epascarello 的评论在这里是绝对必要的。这个订购警告确实是一个值得解决的错误(见下面的答案)。另外,您是否有一个“可能并不总是可以给函数一个明确的顺序”的例子?通常,正如我在下面所说的那样,这是一种值得一试的代码味道。

标签: javascript jslint


【解决方案1】:

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

【讨论】:

  • 值得注意的是 latedef:nofunc 是一个 JSHint-only 指令。
  • @ruffin This answer 似乎暗示它也在 JSLint /*jslint latedef:false*/
  • 人力资源部。它现在在 jslint.com 上不起作用,我也没有在 instructions 中看到它。现在 JSLint 去年 Crockford 更新到 ES6 时发生了很大变化,但我 don't see that in the old instructions (我检查了几个日期)也正如 some comments 建议的那样。也许它是一个奇怪的(qua奇怪和罕见的)版本,或者那个答案是错误的。
【解决方案2】:

@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 中在定义之前就存在的函数。当我在该上下文中多次看到此错误时,我一直很生气,但它 [几乎?] 总是有用地显示出一些代码气味,其中重构很有用,而不是所有函数跳转都需要。

如果你在函数命名空间上跳了很多,你似乎可以绕开警告作弊,我可能在一两个案例中尴尬地做到了这一点。不过,我希望不会(在这两个方面)。


* 我很想将 JSLint 添加到那个问题中,并称这个问题为骗子,但不确定这是否合乎情理。

【讨论】:

  • 有趣的是,JSHint 根本没有抱怨我,只有 JSLint 做到了。
  • 您接受的答案中的建议指令是否对您在 JSLint 中有所改变?或者你在这里的答案仅仅是使用 JSHint?我相信,遵守规则是值得的——不过,一如既往,不要打扰你信任的 3rd 方库!这通常是通往精神错乱的捷径。 ;^)
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 2014-02-25
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多