我一直在使用JSLint让我对我的JavaScript感到不好。顺便说一下,它很棒。有一张我不太了解的支票,请您的意见。
来自jslint.com:
在具有块范围的语言中,通常建议在首次使用的站点声明变量。但是因为JavaScript没有块范围,所以在函数顶部声明所有函数的变量是明智的。 建议每个函数使用一个var语句。
大胆的最后一个意思是什么?我想我应该声明这样的多个变量?
var foo = 1, bar = 2;
并且,“智慧”部分只是一种编程风格,可以阻止错误或者还有更多的错误吗?
感谢您的帮助。
答案 0 :(得分:72)
问题是,无论你是否意识到,javascript都会无形地将所有var声明移动到函数范围的顶部。
所以如果你有这样的功能
var i = 5;
function testvar () {
alert(i);
var i=3;
}
testvar();
警报窗口将包含undefined。因为在内部,它已被改为:
var i = 5;
function testvar () {
var i;
alert(i);
i=3;
}
testvar();
这被称为“吊装”。
crockford如此强烈主张var声明的原因在于它使得代码明显与它要做的事情相匹配,而不是允许发生看不见的和意外的行为。
答案 1 :(得分:8)
基本上在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没有块作用域,因此最好在函数顶部声明所有函数的变量。
选中article。
答案 2 :(得分:6)
缺少块范围解释了以下代码:
var a = 1;
if (something) {
var a = 2;
}
alert(a); // Alerts "2"
在大多数C风格(如语法)语言中,var a = 2
定义仅为if
块的范围定义“a”。在函数顶部使用单个var语句有助于避免这种Javascript的怪癖,这并不总是如上所述,并且对于C / C#/ Java程序员来说是意外的。
答案 3 :(得分:4)
是的,这意味着您在函数的开头声明所有变量。无论您想要在一行还是多行中进行操作都是一个选择。
原因在你提到的段落中有解释。 Javascript变量只有函数级别范围。如果在if / while / for块中声明相同的变量,它将被新值覆盖,因为该块不带有新的作用域。这与Java等语言不同。为了避免这些意外,请在函数开头声明要在函数中使用的所有变量,这样就不会意外地“重新声明”和/或其他。