【问题标题】:What is the reason behind JSLint saying there are "too many var statements"JSLint 说“var statements 太多”背后的原因是什么
【发布时间】:2009-05-01 05:42:24
【问题描述】:

JSLint(打开 onevar 标志)正在标记我拥有的一些 JavaScript 代码:

第 5 行字符 15 的问题:var 语句太多。

我很高兴修复这些错误,但我想知道,我这样做是为了提高性能还是因为它只是一种不好的做法,并且更有可能在我的 javascript 代码中引入错误。 onevar 标志背后的原因是什么?

我确实查看了 var keyword 的 JSLint 文档,但它没有具体说明为什么同一函数中的多个 var 语句不好。

这里是一个例子的尝试。解释代码将如何受益于只有 1 个 var 语句:

function Test(arg) {
   var x = arg + 1,
       y = cache.GetItem('xyz');
   if (y !== null) {
      // This is what would cause the warning in JSLint
      var request = ajaxPost(/* Parameters here */);

   }
}

【问题讨论】:

    标签: javascript refactoring jslint


    【解决方案1】:

    Javascript 没有块作用域。在其他带有它的语言中(如c),如果你在if语句中声明一个变量,你不能在它之外访问它,但在javascript中你可以。 JSLint 的作者认为这是一种不好的做法,因为您(或其他读者)可能会感到困惑并认为您无法再访问该变量,但实际上您可以。因此,您应该在函数顶部声明所有变量。

    【讨论】:

    • 比我更好的答案,修改。
    • 这回答了为什么应该在函数顶部声明所有VARs 的部分问题,但是关于“一个VAR 语句”与“多个@ 987654324@ 声明(全部在顶部)”。这是否有一个好的理由,或者只是“它可以节省打字,所以为什么不呢”?
    • 默认的 JSLint 规则仅代表david crockford's opinion 如何使正确和错误的代码在视觉上区分。他的意见是一个的理由吗?不知道,但这至少是一个的原因。
    【解决方案2】:

    官方原因is here,作者 Douglas Crockford。

    引用:

    在许多语言中,块引入了范围。中引入的变量 块在块外是不可见的。

    在 JavaScript 中,块不引入范围。只有 功能范围。在函数的任何地方引入的变量是 在函数中随处可见。 JavaScript 的块令人困惑 有经验的程序员会因为熟悉的语法而导致错误 做出虚假的承诺。

    JSLint 需要带有函数、if、switch、while、for、do 和 try 语句,别无他处。

    在具有块范围的语言中,通常建议 变量在第一次使用的地方声明。但是因为 JavaScript 没有块作用域,最好声明一个函数的所有 函数顶部的变量。建议单 每个函数都使用 var 语句。这可以用 vars 拒绝 选项。

    【讨论】:

      【解决方案3】:

      只需像这样在一个地方声明你的变量:

      var request,x,y;
      

      【讨论】:

        【解决方案4】:

        如果每个函数只允许一个 var 语句,则“onevar”选项设置为 true。

        if (funct['(onevar)'] && option.onevar) {
            warning("Too many var statements.");
        }
        

        【讨论】:

        • 好的,我在问题中澄清了我专门打开了它。所以我知道它为什么会警告我,但是修复这些警告对我的代码有什么作用?
        【解决方案5】:

        推理已经描述了。

        建议使用这种形式:

        var myVar1 = document.getElementById("myDiv1"),
          myVar2 = document.getElementById("myDiv2");
        

        或者这个:

        var myVar1, myVar2;
        myVar1 = document.getElementById("myDiv1");
        myVar2 = document.getElementById("myDiv2");
        

        但这看起来不太好,特别是如果你想记录变量。

        所以你可以暂时禁用这个警告:

          /*jslint vars: true*/
          /**
           * @returns {HTMLDivElement}
           */
          var myVar1 = document.getElementById("myDiv1");
          /**
           * @returns {HTMLDivElement}
           */
          var myVar2 = document.getElementById("myDiv2");
          /*jslint vars: false*/
        

        警告:确保这是在函数顶部完成的。

        我认为这样做是因为 jslint 无法可靠地确定 vars 是否在函数顶部声明。

        【讨论】:

          【解决方案6】:

          这里只是猜测,但可能是functional decomposition 的时间了。函数应该做一件事并且做好。

          太多的 vars 暗示一个函数试图做太多事情。或者您应该使用数组的情况。

          【讨论】:

          • 不确定我是否同意这一点。在这种情况下,“太多”不止一个 var。要绕过它,您可以使用逗号 (var x,y;),但这很难阅读。在我看来,这非常荒谬,并且会导致难以阅读的代码。我目前正在做一个有很多这样的项目,很难看到变量是在哪里声明的。
          【解决方案7】:

          这个想法是你应该使用一个对象而不是单个变量。那么你在哪里得到:

          var x = arg + 1,
              y = cache.GetItem('xyz');
          

          改成:

          var dimensions = {};
          dimensions.x = arg + 1;
          dimensons.y = cache.GetItem('xyz');
          dimensions.request = ...
          

          然后您可以通过对象访问这些变量,每个函数都有一个对象来包含该函数变量更简洁。那么你将不会收到警告。

          【讨论】:

            猜你喜欢
            • 2011-06-20
            • 1970-01-01
            • 2018-08-31
            • 2020-01-26
            • 2016-03-31
            • 2013-05-23
            • 2011-11-06
            • 2021-11-01
            • 2010-10-03
            相关资源
            最近更新 更多