63

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

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

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

我确实查看了var 关键字的 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 */);

   }
}
4

7 回答 7

98

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

于 2009-05-01T06:03:51.640 回答
28

官方原因在这里,由 Douglas Crockford 撰写。

去引用:

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

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

JSLint 需要带有函数、if、switch、while、for、do 和 try 语句的块,而其他任何地方都没有。

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

于 2009-11-19T15:35:51.177 回答
6

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

var request,x,y;
于 2009-11-05T15:41:17.310 回答
3

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

if (funct['(onevar)'] && option.onevar) {
    warning("Too many var statements.");
}
于 2009-05-01T05:50:14.030 回答
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 是否在函数顶部声明。

于 2012-10-13T23:08:51.463 回答
1

这里只是一个猜测,但可能是功能分解的时候了。函数应该做件事并做好。

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

于 2009-05-01T05:48:34.003 回答
-6

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

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

将其更改为:

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

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

于 2009-09-20T22:26:34.087 回答