JavaScript中每个函数一个var?

JavaScript中每个函数一个var?,javascript,lint,Javascript,Lint,我一直在使用JSLint来让我对我的JavaScript感到不好。顺便说一句,太棒了。有一张支票我不太明白,我想听听你的意见 发件人: 在具有块作用域的语言中,通常建议在首次使用时声明变量。但是因为JavaScript没有块作用域,所以在函数顶部声明函数的所有变量更明智建议每个函数使用一条var语句。 黑体字的最后一句话是什么?我想我应该像这样声明多个变量 var foo = 1, bar = 2; 而且,“明智”部分仅仅是一种阻止错误的编程风格,还是有更多的原因呢 感谢您的帮助。基本上,在J

我一直在使用JSLint来让我对我的JavaScript感到不好。顺便说一句,太棒了。有一张支票我不太明白,我想听听你的意见

发件人:

在具有块作用域的语言中,通常建议在首次使用时声明变量。但是因为JavaScript没有块作用域,所以在函数顶部声明函数的所有变量更明智建议每个函数使用一条var语句。

黑体字的最后一句话是什么?我想我应该像这样声明多个变量

var foo = 1, bar = 2;
而且,“明智”部分仅仅是一种阻止错误的编程风格,还是有更多的原因呢


感谢您的帮助。

基本上,在JavaScript块(
{…}
)中,不引入新的作用域,只有函数作用域,因此不会在任何其他语句上创建作用域

函数中任何地方引入的变量在函数中的任何地方都可见

例如:

function myFunction(){
  var one = 1;

  if (one){
    var two = one + 1;
  }

  (function () {
    var three = one + two;
  })();

  // at this point both variables *one* and *two* are accessible but 
  // the variable *three* was declared in the scope of a inner function
  // and is not accessible  at this point.
}
在具有块作用域的语言中,建议在首次使用时声明变量,但由于JavaScript没有块作用域,因此最好在函数顶部声明函数的所有变量


选中此项。

是,这意味着您在函数开头声明了所有变量。你想在一行还是多行中完成这件事是一个选择的问题


你提到的那一段解释了原因。Javascript变量只有函数级别的作用域。如果在If/while/for块中声明了相同的变量,它将被新值覆盖,因为该块没有新的作用域。这与Java等语言不同。为了避免这种意外,请在函数开始时声明要在函数中使用的所有变量,这样您就不会意外地“重新声明”等等。

问题是,无论您是否意识到,javascript都会不可见地将所有var声明移到函数范围的顶部

如果你有这样一个函数

var i = 5;
function testvar () {
     alert(i);
     var i=3;
}
testvar();
警报窗口将包含未定义的。因为在内部,它被更改为:

var i = 5;
function testvar () {
     var i;
     alert(i);
     i=3;
}
testvar();
这叫做“吊装”。
crockford如此强烈地提倡将var声明放在顶部的原因是,它使代码与它将要执行的操作明显匹配,而不是允许出现不可见和意外的行为。

块范围的缺失解释了下面的代码:

var a = 1;
if (something) {
    var a = 2;
}

alert(a); // Alerts "2"

在大多数C风格(如语法)语言中,
var a=2
定义将仅为
if
块的范围定义“a”。在函数顶部使用一条var语句有助于避免Javascript的这种怪癖,这种怪癖并不总是像上面所说的那么明显,而且对于C/C#/Java程序员来说是出乎意料的。

我认为重新定义变量不是问题所在。这不会像在C(或java?)中那样引发错误。事实上,它什么也没做。对不起,我必须说得更清楚些。我的意思是在块中声明相同的变量名,这在Java中是允许的。这个新变量只存在于块内部。啊,是的,我想如果你习惯了块范围的语言,那将是一个问题。我的阅读理解技能今天糟透了。我完全误解了你原来的帖子。没问题,我也可以把我的答案框得更好。不过你没有真正解释为什么它更好。最终,从功能范围来看,变量最好位于顶部。但是你忽略了从事实到结论的推理步骤。我刚刚读了你链接的文章,它犯了和契坦一样的错误。重新说明var是一个NOOP。它是完全良性的,不会引起任何问题。这并不是说将自己限制在一个var语句中是没有用的,但是你,或者这篇文章,实际上已经为它提供了一个令人信服的理由。@Breton,它可能会引起问题,因为它通常反映了一个困惑的程序员。这也会让其他程序员感到困惑,他们做了一些明智的事情,把所有变量都放在函数的顶部。就目前而言,这就像一个三段论,缺少了它的第二个前提。小猫毛茸茸的,又小。因此小猫很可爱。(尽管如此,这是一个无效的论点,因为你忽略了“所有毛茸茸的小东西都很可爱”)我从和得到了两个极好的答案。我觉得他们一起回答了这个问题。我怎样才能把两者都归功于呢(顺便说一句,如果你真的想对你的代码感到不好,试着把源代码读给JSLINT,弄清楚它是如何工作的。它非常简单易读,但仍然很神秘。这就像发现宇宙是一个由方程2+2=计算出的分形。有没有人没有一个工具可以自动将代码重新格式化为e每函数var风格?(但不是缩小)Cowboy对多个var语句有一个很好的反论证(我现在是它的粉丝):这并没有回答问题中以粗体突出显示的部分,即为什么只推荐一个var语句。这只解释了为什么var语句的基本原理应该出现在函数的开头。你知道为什么只推荐一个吗?我很好奇,因为在我看来,这会对代码的可读性产生负面影响。@Michael Lang我无法告诉你其他人是如何合理化它的,但就我而言,它迫使我使用尽可能少的变量,这是一种很好的代码风格。如果函数开始有太多的变量,你需要多个var语句来保持清晰,我要说这是一种代码味道(我很内疚!)。使用单个var语句,在参数旁边,您还可以一眼看到函数中单个位置的所有元素。将每个元素放在单独的行上可能不太清晰,并且会占用m的空间