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 */);
}
}
答案 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 = ...
然后,您可以通过对象访问这些变量,它的内部每个函数都有一个对象来包含该函数变量。然后你就不会收到警告。