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

7hi*_*4g0 5 javascript jslint hoisting

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

问题

这些答案都不是为什么显示错误.

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

这也称为吊装.

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

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

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

问题(S)

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

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

注意

寻找像这样的答案:

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

谢谢 :*

Mch*_*chl 3

这不是一个错误(毕竟你的代码确实有效)。与此相关的问题是,在使用函数后声明函数会降低代码的可读性。阅读您的代码的人可能会认为该函数是在外部作用域中的某个位置声明的。如果您覆盖流行的函数/构造函数,例如Date