75

我正在使用 JSLint 来验证我的大多数外部 Javascript 文件,但我得到的最大错误数来自于在定义之前使用的函数。

这真的是我应该担心的问题吗?

似乎 Firefox、IE7 和 Chrome 不在乎。根据 JSLint 的说法,像流行的init()(我经常使用的)这样的函数通常贴在顶部,因为这对我来说很有意义(我喜欢假装它类似于),需要将其推到文件的底部。main()

4

8 回答 8

86

由于这是评价最高的 google hit 并且其他人可能一开始在 jslint 工具中看不到它,因此有一个名为“Tolerate misordered definitions”的选项允许您隐藏此类错误。

/*jslint latedef:false*/
于 2012-03-01T07:35:32.293 回答
69

如果使用function关键字声明函数,则可以在声明之前使用它们。但是,如果您通过其他方法声明函数(例如使用函数表达式或Function构造函数),则必须在使用之前声明该函数。有关更多信息,请参阅Mozilla 开发人员网络上的此页面。

假设您使用function关键字声明所有函数,我认为这将成为一个编程风格的问题。就个人而言,我更喜欢以一种看起来合乎逻辑的方式来构建我的函数,并使代码尽可能地可读。例如,像你一样,我会init在顶部放置一个函数,因为它是一切的起点。

于 2009-04-30T10:47:55.510 回答
33

如果您使用的是 jshint,您可以设置latedefnofunc,这将仅忽略后期函数定义。

文档 - http://www.jshint.com/docs/options/#latedef

示例用法:

/* jshint latedef:nofunc */

noop();

function noop() {}

希望这可以帮助。

于 2014-05-28T16:08:34.603 回答
11

从 jslint 的网站 ( http://www.jslint.com/lint.html ),您可以了解 /*global*/ 指令,该指令允许您设置假定在其他地方声明的变量。

这是一个示例(将其放在文件顶部):

/*global var1,var2,var3,var4,var5*/

根据我的经验,实际上并不需要 :true :false ,但从我在网站上阅读的内容来看,它似乎是推荐的。

确保初始全局语句与 位于同一行/*,否则它会中断。

于 2012-07-18T15:09:38.727 回答
2

要为所有文件禁用此警告jshint,请将其放在您的.jshintrc文件中:

{
   "latedef": false
}
于 2014-08-21T16:58:46.877 回答
2

在您的.jshintrc文件中,设置:

  "latedef": "nofunc",
于 2016-05-06T04:16:45.693 回答
1

很不幸,latedef 选项被删除了。当试图创建一个顶部有接口的“类”时,这是必不可少的,即

function SomeClass() {
   var self = this;
   self.func = func;

   function func {
      ...
   }
}

这种风格很常见,但不会通过 jsLint,因为 func 在定义之前已“使用”。必须为每个“成员”功能使用全局是一件非常痛苦的事情。

于 2015-01-21T03:45:20.280 回答
0

您始终可以在顶部声明有问题的函数

例如:变量初始化;

....但是当您进一步了解真实定义时,您将不得不删除“var”:

初始化 = 函数() { };

于 2013-05-04T14:35:50.993 回答