下面描述的两种方式之间有什么区别吗?我应该使用哪一个为什么?
while (true) {
let test = getValue();
....
}
和
let test;
while (true) {
test = getValue();
....
}
let
是块范围的,这意味着它只存在于{...}
块中。
如果您不打算在while
循环之外访问变量test
,则应使用第一种形式。
while (true) {
let test = getValue();
....
}
如果需要从while
循环外部访问test
或跨迭代重用它,则应使用第二种形式。
let test;
while (true) {
test = getValue();
....
}
另请注意,如果您不打算将另一个值重新分配给test
,最好使用const
。
如果在 while 循环之外使用测试变量,请使用第二个:
let test;
while (true) {
test = getValue();
....
}
if (test) { ... } // <--- Use test outside the while loop
否则,第一个更好
是的,第一个版本有所不同,您无法在 while 循环之外访问变量测试。在第二个版本中,您可以在循环之外访问测试变量。
是的,有区别:
- 在第一种示例中,每个循环迭代都有一个单独的
test
变量;在第二种情况下,所有循环迭代只有一个共享test
变量。如果您在循环中创建任何函数,这将具有重要影响,并且可以具有性能方面(当然,像所有性能方面一样,它只是在出现问题时才是一个问题)。 - 在第一个示例(每个)中,
test
变量只能在循环内访问;在第二个示例中,一个test
变量也可以在循环外部访问。
我应该使用哪一个为什么?
适合这种情况。如果每个循环都需要一个单独的test
变量,或者只是希望它对循环私有,请使用第一个;如果没有,请使用第二个。
在第一个版本中,变量的范围在 while 循环中受到限制,而在另一个变量中,可以在 while 循环之外访问。
是的,它们之间存在差异。
-
如果在循环外部声明变量,则可以在循环中更新该变量,然后在循环外的其他代码中访问该变量。
-
如果你在循环中声明它,它只能在该循环中更新和访问。
>let
有一个块作用域- 这意味着变量将仅存在于其周围的花括号对中。因此,在这种情况下,当我们尝试在循环后打印let
的值时,它将返回undefined
。
while (true) {
let test = getValue();
console.log(test); // => some value...
....
}
console.log(test); // => undefined
在这种情况下,test
已在 while 循环(大括号)之前定义,因此它将保留在 while 循环之外:
let test;
while (true) {
test = getValue();
console.log(test); // => some value...
....
}
console.log(test); // => still some value...
请注意,即使您在 while 循环内外使用let
,它也会以相同的方式处理它:
let test = 5;
while (true) {
let test = 4;
console.log(test); // => 4
....
}
console.log(test); // => 4, not 5
所以不要试图定义你自己的独立于主变量的特殊块范围变量
我不会给出一个可运行的代码示例,否则你最终会陷入无限循环
let 是块范围的,这意味着它只存在于 {...} 块中。
因此,如果要在循环之外访问 let 值,则必须使用它,
let data;
while (true) {
data = getData()
}