在javascript中为创建循环时,我必须在哪里声明变量?
在javascript中创建“for循环”时,我看到了两种声明变量的不同方式: 第一种方式:在javascript中为创建循环时,我必须在哪里声明变量?,javascript,Javascript,在javascript中创建“for循环”时,我看到了两种声明变量的不同方式: 第一种方式: for (var i = 0, l = [].length; i < l; i += 1) { // make something } for(变量i=0,l=[].length;i
for (var i = 0, l = [].length; i < l; i += 1) {
// make something
}
for(变量i=0,l=[].length;i
第二种方式:
var i;
var l;
for (i = 0, l = [].length; i < l; i += 1) {
// make something
}
vari;
变种l;
对于(i=0,l=[].length;i
有什么理由选择其中一种吗?鉴于您展示的代码,它们是一样的。然而,JS有一些奇怪之处,这可能会在更复杂的代码中引起问题。此外,对于未来的开发人员来说,还存在可维护性和可读性的问题。有些是非常主观的,有些是客观的 我使用了两种方法的组合,只是略有不同——单个var语句,位于范围的顶部
var x = function () {
var i,
l;
for (i = 0, l = [].length; i < l; i += 1) {
// make something
}
};
var x=函数(){
var i,
L
对于(i=0,l=[].length;i
原因是我更喜欢每个作用域(函数)使用一条var语句,并且该语句位于作用域的顶部。JSLint/JSHint默认情况下强制执行此操作。客观上,它有助于避免JS提升机制的问题,JS提升机制在预执行过程中将所有变量声明移动到范围的顶部。诚然,主观上,它让后来的开发人员非常清楚在这个范围内引入了哪些变量。假设范围中使用的任何其他var来自更高级别的范围。它们是相同的,您可以使用其中一个,但第一个更具可读性和简洁性 关键是,这两种情况下的变量都是局部变量,存在
var
关键字。使用第一种方法,还可以创建两个局部变量:
var i, l
而不是
var i
var l
当只有一个人可以做的时候,为什么要一次又一次地使用
var
关键字呢。事实上,这是JS的一个良好实践。不,这两个都是正确的。我自己更喜欢第一个
不正确的方法是:
for (var i = l = 0; ...; ...) {
...
}
如果i和l之间没有逗号,则l是全局的。不,至少在Chrome中,范围是完全相同的,并且两种方式都是等效的。在javascript中,除了从可维护性的角度来看,没有区别。将声明和用法放在附近有助于提高可读性。你应该选择哪一个更可读。之所以选择第二个而不是第一个,是因为JS中的变量没有块作用域,而是词法(或函数)作用域,这意味着变量在定义的函数中可见(在嵌套函数中也可见) 例如:
function foo() {
for (var i = 0; i < 10; i++) {
alert(i);
}
alert(i); // works, because i has lexical scope
}
函数foo(){
对于(变量i=0;i<10;i++){
警报(一);
}
alert(i);//有效,因为我有词法作用域
}
在大多数类似C的语言中,变量具有块作用域,这意味着它们在定义它们的块中可见,因此:
void foo() {
for (int i = 0; i < 10; i++) {
print(i);
}
}
print(i); // won't work, i is not visible any more
void foo(){
对于(int i=0;i<10;i++){
印刷品(一);
}
}
打印(i);//不行了,我再也看不见了
因此,来自Java/C/C++等语言的人可能认为第一个示例中的VARI具有块作用域,而实际上没有。这就是为什么一些程序员喜欢在函数的开头声明所有变量
就我个人而言,我认为即使这样,你也应该坚持这个习惯,尽可能地在使用变量的地方声明变量
编辑
正如JAAulde所提到的,如果你真的了解JS范围规则(和怪癖),你应该只声明接近其用法的变量。实际上,根据万能的规则:因为javascript有函数范围,所以最好总是首先在函数头声明变量
但是,正如其他人所指出的,这并不重要,应该根据个人喜好和可读性来做。他的第一个方法也使用了single
var
,这与您所做的相同。@Sarfraz single var语句用于整个函数,而不仅仅是循环。@Sarfraz True,但不在范围的顶部,这就是我这么说的原因。我会编辑说我使用了这两个变量的组合…@JAAulde:Ok有道理,但我想不应该在顶部定义面向循环的变量。@Sarfraz我总是在顶部声明它们,有时也在顶部定义它们。这要视情况而定。坚持“声明接近使用”的唯一问题是JS不是C。JS有一个提升机制,这是一个奇怪的现象,当var声明在没有正确理解该机制的情况下到处进行时,可能会导致问题。