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,这样你就不会意外地“重新声明”了。