【问题标题】:JSLint: Using a function before it's defined errorJSLint:在定义错误之前使用函数
【发布时间】:2010-10-22 19:30:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript jslint


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我也更喜欢 init-method。所以它使用的功能如下。如何忽略或破解此错误,因为它阻止我在代码中看到下一个 JsLint 错误?我想要一个通用的方法来保持我的风格,但看不到这个错误。
      【解决方案3】:

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

        "latedef": "nofunc",
      

      【讨论】:

        【解决方案4】:

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

        {
           "latedef": false
        }
        

        【讨论】:

          【解决方案5】:

          如果您使用 jshint,您可以将 latedef 设置为 nofunc,这将仅忽略后期函数定义。

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

          示例用法:

          /* jshint latedef:nofunc */
          
          noop();
          
          function noop() {}
          

          希望这会有所帮助。

          【讨论】:

          • 这是 2014 年的解决方案。
          • 此解决方案仅适用于 jshint 吗?我使用“括号”,我收到很多 lint 警告。 lint 应该与此提示解决方案兼容。我没有让它工作。
          【解决方案6】:

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

          /*jslint latedef:false*/
          

          【讨论】:

          • 将该选项设置为true 似乎并没有为我“解决”这个问题。
          • 我遇到了和 Markus 一样的问题。
          • 你能分享你的javascript吗? @M.Herold
          • @PeterMajeed 不,不是。克里斯并不是在问如何容忍错误的定义。
          【解决方案7】:

          你总是可以在顶部声明有问题的函数

          例如: 变量初始化;

          ....但是当您进一步了解真正的定义时,您必须删除“var”:

          初始化 = 函数() { };

          【讨论】:

          • 警告:init = function(){}function init() {} 不同,ECMAScript 对匿名函数有不同的规则,这是第一个。
          【解决方案8】:

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

          这是一个例子(把它放在文件的顶部):

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

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

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

          【讨论】:

          • 对我来说,global 这个词也必须直接放在星号后面,不能有空格,否则会被忽略。
          猜你喜欢
          • 2012-10-09
          • 2014-06-07
          • 2011-11-17
          • 2012-03-26
          • 2011-11-06
          • 2012-08-30
          • 2017-07-18
          • 2012-05-18
          • 1970-01-01
          相关资源
          最近更新 更多