为什么JSLint抱怨:“在定义之前使用了someFunction()”?

5

在寻找JSLint错误“在定义之前使用”时,我找到了以下内容:

问题

这些答案都没有说明为什么会出现这个错误。

详细说明

根据 ECMA-262规范,在执行开始之前,函数将被评估,因此使用 function 关键字声明的所有函数都可用于所有代码,而与它们声明的位置无关(假设它们在该范围内是可访问的)。

这又被称为提升

道格拉斯·克罗克福德似乎认为最好在使用它的代码之前声明每个函数,而不管提升效果如何。

根据 StackOverflowNewbie 在他的问题中,这引起了一些代码组织问题。更不用说有些人,比如我,更喜欢在主/初始化代码下声明他们的函数。

在这些问题中,有一些避免或修复错误的方法,例如使用函数表达式vs函数声明。但是没有一个人向我展示了错误的原因。甚至没有 Crockford的网站

问题

为什么在声明之前调用函数是一个错误,即使它使用 function 关键字声明?

在JSLint上下文中,使用函数表达式而不是函数声明更好吗?如果有一个首选项,为什么?

注意

不要提供以下答案:

  • Crockford 是一个暴君
  • 这只是 Crockford 的观点

谢谢 :*


4
但这是 Crockford 的观点! - Quentin
jshint 是否对此抱怨? - Dagg Nabbit
2
JSLint是一种工具,用于检查您的代码是否符合Crockford喜欢的编码风格。它不是用于针对规范进行验证或确保与JS引擎兼容性的工具。对于大多数JSLint问题,“这只是Crockford的观点”是一个有效(也是唯一)的答案。 - JJJ
1
仅仅说“这是他的观点”并不具有建设性,也无助于任何人。他有一些经验,值得知道为什么他认为这样做会更好,而不仅仅是抱怨JSLint并转向JSHint。讨论为什么往往能带给我很多知识。如果你只是简单地说这是他的观点而放弃了一个学习的好机会,那是你的选择。 - 7hi4g0
1
JSHint允许通过/jslint latedef:false/来禁用警告:https://dev59.com/5nRA5IYBdhLWcg3w1BqW#9512299 - David Sykes
显示剩余4条评论
2个回答

3
这并不是错误(你的代码实际上确实有效)。问题在于,将函数声明放到使用之后会降低代码的可读性。读取你的代码的人可能会认为这个函数是在外部作用域中声明的。如果你覆盖了常用的函数/构造函数比如Date,那么这可能会特别令人困惑。

1
我使用错误作为一种说话方式。谢谢你的回答。我想象了这样的情景 :) - 7hi4g0

0

一般来说,如果你要按照jshint/jslint的建议,在使用函数之前定义它们,那么除了美学原因外,没有什么特别的理由优先选择函数声明而不是函数表达式。

这是我的观点:在使用函数之后声明它们是不好的,除非非常清楚地知道你正在引用同一作用域中声明的函数。这可以通过良好的命名或接近性来实现。

例如,你在声明函数之前立即返回对该函数的引用。在这里,你已经澄清了外部函数的意图,这同样重要,读者知道他们不必向下滚动查看是否有与外部作用域相关的其他代码。

话虽如此,我也认为在你的外部作用域代码中散布函数声明对可读性也很糟糕,但也许我是个可怕的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接