JSLint背后有什么原因说“var语句太多”

时间:2009-05-01 05:42:25

标签: javascript refactoring jslint

JSLint(打开onevar标志)正在使用以下内容标记我的一些javascript代码:

Problem at line 5 character 15: Too many var statements.

我很乐意解决这些错误,但我想知道,我是为了性能而做,还是因为这只是一种不好的做法,并且更有可能在我的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 */);

   }
}

7 个答案:

答案 0 :(得分:98)

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

答案 1 :(得分:28)

官方理由is here,作者Douglas Crockford。

引用:

  

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

     

在JavaScript中,块不会引入范围。只有   函数范围。在函数中的任何位置引入的变量是   在功能中到处可见。 JavaScript的块混淆了   经验丰富的程序员,因为熟悉的语法而导致错误   作出虚假承诺。

     

JSLint期望具有函数的块,if,switch,while,for,do和   尝试陈述而不是其他地方。

     

在具有块范围的语言中,通常建议使用   变量应在首次使用的站点声明。但是因为JavaScript   没有块范围,声明所有函数是明智的   函数顶部的变量。建议单一   每个函数使用var语句。这可以通过vars拒绝   选项。

答案 2 :(得分:6)

只需在这样的地方宣布你的变种:

var request,x,y;

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

已经描述了推理。

建议使用此表格:

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是否在函数顶部声明。

答案 5 :(得分:1)

这里只是猜测,但可能是functional decomposition的时间。函数应该一个的东西并且做得很好。

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

答案 6 :(得分:-6)

这个想法是你应该使用一个对象而不是单个变量。所以你在哪里:

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

将其更改为:

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

然后,您可以通过对象访问这些变量,它的内部每个函数都有一个对象来包含该函数变量。然后你就不会收到警告。