JSLint说“有太多的var语句”的原因是什么?

JSLint(打开onevar标志)正在标记一些JavaScript代码,我用下面的代码:

 第5行的问题15:var语句过多。 

我很高兴能够解决这些错误,但是我想知道,是因为性能还是因为这只是一个不好的做法,并且在我的JavaScript代码中引入错误的可能性更大。 onevar旗帜背后的原因是什么?

我没有看到关于var关键字的JSLint文档,但是并没有具体谈到为什么同一个函数中的多个var语句不好。

这是一个例子的尝试。 解释代码如何从只有一个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没有块范围。 在其他语言(如c)中,如果你在if语句中声明一个variables,你不能在它之外访问它,但在JavaScript中你可以。 JSLint的作者认为这是一个不好的做法,因为你(或其他读者)可能会感到困惑,认为你不能再访问这个variables,但实际上你可以。 因此,你应该在函数的顶部声明所有的variables。

官方原因在这里 ,由道格拉斯·克罗克福德。

去引用:

在很多语言中,块引入了一个范围。 块中引入的variables在块之外是不可见的。

在JavaScript中,块不会引入范围。 只有函数范围。 在函数的任何地方引入的variables在函数的任何地方都是可见的。 JavaScript的块混淆了有经验的程序员,并导致错误,因为熟悉的语法造成了错误的承诺。

JSLint期望有函数的块,如果,切换,while,for,do和try语句和其他地方。

在具有块范围的语言中,通常build议在首次使用的站点声明variables。 但是因为JavaScript没有块范围,所以在函数顶部声明一个函数的所有variables是明智的。 build议每个函数使用一个var语句。 这可以通过vars选项来降低。

只要在这样一个地方宣布你的变数:

 var request,x,y; 

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

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

推理已经被描述了。

build议使用这种forms:

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

或这个:

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

但这看起来不太好,特别是如果你想loggingvariables。

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

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

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

我认为这是因为jslint不能可靠地确定是否在函数顶部声明了variables。

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

太多的变数是暗示着一个function太多了。 或者你应该使用数组的情况。

这个想法是,你应该使用一个对象,而不是个别的variables。 那么你在哪里得到:

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

将其更改为:

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

然后你可以通过这个对象访问这些variables,而且每个函数都有一个对象来包含那个函数variables。 那么你不会得到警告。