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

时间:2013-12-26 14:39:03

标签: javascript jslint hoisting

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

问题

这些答案中没有一个为什么显示错误。

精化

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

这又称为吊装

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

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

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

问题(S)

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

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

注意

寻找以下答案:

  • Crockford是一个暴君
  • 只是Crockford的意见

谢谢:*

2 个答案:

答案 0 :(得分:3)

这不是错误(你的代码毕竟有效)。对此的关注是在使用后声明函数会降低代码的可读性。阅读代码的人可能认为此函数在外部范围内声明。如果您覆盖像Date

这样的流行函数/构造函数,这可能会特别令人困惑

答案 1 :(得分:0)

一般来说,如果你要做jshint / jslint所说的,并在使用它们之前定义函数,那么在函数表达式上更喜欢函数声明并没有压倒性的理由(除了审美之外)。

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

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

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