5

搜索 JSLint 错误“在定义之前使用”我发现了这些:

问题

这些都没有回答为什么会显示错误。

细化

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

这也称为提升

Douglas Crockford 似乎认为不管提升效果如何,最好在使用它的代码之前声明每个函数。

根据StackOverflowNewbie在他的问题中的说法,这会引发一些代码组织问题。更不用说像我这样的一些人更喜欢在 main/init 代码下声明他们的函数。

在这些问题上,有一些方法可以避免或修复错误,例如使用函数表达式与函数声明。但他们都没有告诉我错误的原因。甚至没有Crockford 的网站

问题)

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

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

笔记

寻找类似的答案:

  • 克罗克福德是个暴君
  • 只是克罗克福德的意见

谢谢 :*

4

2 回答 2

3

这不是错误(您的代码毕竟可以工作)。对此的担忧是,在使用函数后声明函数会降低代码的可读性。阅读您的代码的人可能会认为此函数是在外部范围内的某处声明的。如果您覆盖流行的函数/构造函数,这可能会特别令人困惑Date

于 2013-12-26T14:43:33.133 回答
0

通常,如果您要按照 jshint/jslint 所说的那样做,并在使用函数之前定义函数,那么没有压倒性的理由(除了美学)更喜欢函数声明而不是函数表达式。

这是我的观点:在使用函数后声明它们是不好的,除非很清楚您指的是在同一范围内声明的函数。这可能是良好命名或接近的结果。

例如,您在声明函数之前立即返回对已声明函数的引用。在这里,您已经阐明了外部函数的意图,这同样重要,并且读者知道他们不必向下扫描以查看是否有特定于外部范围的附加代码。

也就是说,我也认为在你的外部范围的意图代码中散布函数声明对于可读性来说也是可怕的,但也许我是一个糟糕的人。

于 2014-06-05T14:35:26.317 回答