JavaScript中的每个函数都有一个variables?

我一直在使用JSLint让我感觉不好我的JavaScript。 顺便说一句,这很好。 有一张支票,我不太明白,我想请你的意见。

来自jslint.com :

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

大胆的最后一个表态是什么? 我想我应该像这样声明多个variables?

var foo = 1, bar = 2; 

而且,“明智”的部分只是一种编程风格,可以阻止错误的发生,或者还有更多呢?

谢谢你的帮助。

问题是,不pipe你是否意识到,javascript都会将所有的var声明移动到函数作用域的顶部。

所以如果你有这样的function

 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声明的原因在于,它使得代码明显地匹配它将要做的事情,而不是允许发生不可见和意外的行为。

基本上,JavaScript块( { ... } )不会引入新的作用域,只有函数作用域,所以在任何其他语句上都不会创build作用域。

在函数的任何地方引入的variables在函数的任何地方都是可见的。

例如:

 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. } 

在具有块范围的语言中,它build议在首次使用时声明variables,但由于JavaScript没有块范围,所以最好在函数顶部声明一个函数的所有variables。

检查这篇文章 。

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

 var a = 1; if (something) { var a = 2; } alert(a); // Alerts "2" 

在大多数C语言(与语法相同)的语言中, var a = 2定义只会为if的范围定义'a'。 在函数的顶部使用一个var语句有助于避免这种Javascript的怪癖,这种情况并不总是像上面那样明显,而且对于C / C#/ Java程序员来说是意想不到的。

是的,这意味着你在函数的开头声明了所有的variables。 无论你想要在一条线上还是多条线上做,都是一个select。

原因在你提到的段落中有解释。 JavaScriptvariables只有function级别的范围。 如果在if / while / for块中声明相同的variables,它将被新值覆盖,因为该块没有新的范围。 这与Java等语言不同。 为了避免这样的惊喜,在函数的开头声明你要在函数中使用的所有variables,这样你就不会意外地“重新声明”了。