【问题标题】:Do I need to tell jslint about functions that have not yet been defined inside another function?我是否需要告诉 jslint 尚未在另一个函数中定义的函数?
【发布时间】:2012-09-17 23:26:33
【问题描述】:

我有这样的代码:

function dialog($link) {
    "use strict";

   function doDialogAjax() {
        $.ajax({
            cache: false,
            url: url,
            dataType: 'html'
        })
            .done(onDialogDone)
            .fail(onDialogFail);
   }

   function onDialogDone(data) {
        content = data;
   // ... 
   }
}

jslint 抱怨 onDialogDone 尚未定义。我真的需要在我的代码顶部将它定义为一个全局变量吗?我问的原因是因为我不认为 onDialogDone 函数是全局的。它只是一个尚未在外部函数中定义的函数。

我说这样定义的函数在最后一个花括号后的末尾不应有分号是否正确?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您不需要将其定义为全局,只需在 ajax 调用之前定义即可。这实际上无关紧要,原因有两个:

    • 函数定义还是hoisted
    • ajax 调用是异步的,所以下面的代码将在回调被触发之前执行

    尽管如此,拥有符合 jslint 的代码是件好事,但这不是生死攸关的问题;)

    【讨论】:

      【解决方案2】:

      您的代码非常好。但是,由于JSLint 使用Pratt Parser (Top Down Operator Precedence) 来分析您的代码,当它第一次看到onDialogDone 时,它会报错,因为它还没有定义。

      为了防止它抱怨,只需将功能移到顶部即可。这样,JSLint 将首先解析定义,当它看到.done(onDialogDone) 时,它会知道符号onDialogDone 指的是什么。

      function onDialogDone(data) {
        // ...
      }
      
      function doDialogAjax() {
        // ...
      }
      

      【讨论】:

      • 我添加了 /*global onDialogDone, onDialogFail, submitHandler*/ 但是现在 jslint 抱怨说 onDialogDone 是一个未使用的变量。这有意义吗?
      • @SamanthaJ:不要将global 用于函数。要解决最初的问题,您需要做的就是将函数 onDialogDone 推到顶部,以便 JSLint 在调用之前选择它的定义。但同样,请注意您的代码非常好。只是 JSLint 没有使用 JavaScript 解释器,而是一个自顶向下的解析器,因此在你当前的代码顺序中,当它第一次检测到符号 onDialogDone 时,它还没有定义。
      【解决方案3】:

      jslint 抱怨很多事情是因为它的作者认为它们是糟糕的风格,而不是因为它们本质上是不正确的。

      在这种情况下,您的函数定义将被提升到范围的顶部,并且是完全有效的代码。

      在分号问题上,包含一个并没有什么坏处。不过,ES5 规范并不要求它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-16
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        • 2011-04-16
        • 2020-10-04
        相关资源
        最近更新 更多