为什么'I'在不同的函数中更改嵌套循环?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么'I'在不同的函数中更改嵌套循环?相关的知识,希望对你有一定的参考价值。
我一直在我的代码中发现一些奇怪的行为,并最终将其追溯到我认为不可能的事情。 for循环中使用的变量“i”在另一个函数的封闭for循环内更改。
在这种情况下,函数a仅记录0并且函数b 0-9。我想要的行为是两个函数记录0-9。
我在代码中解决了变量名称'i1'和'i2'的问题。但我猜测有一个更优雅的解决方案。
function a() {
for (i=0;i<10;i++) { // Changed to i1
console.log('a',i);
b() ; }
}
function b() {
for (i=0;i<10;i++) { // Changed to i2
console.log('b',i);
}
}
a() ;
在声明局部变量时使用let
。否则,正如其他人所提到的那样,i
变得全球化。
function a() {
for (let i=0;i<10;i++) {
console.log('a', i);
b(); }
}
function b() {
for (let i=0;i<10;i++) {
console.log('b', i);
}
}
a();
提示:use let
over var
通常是更好的做法。它将帮助您限制局部变量的范围。在上面的例子中,使用let
将i
的范围限制在循环内,而var
将整个函数设置为范围(尝试使用var
并在循环后打印i
的值)。
您要将i添加到全局窗口对象,这将按预期运行:
function a() {
for (var i=0;i<10;i++) { // Changed to i1
console.log('a',i);
b() ; }
}
function b() {
for (var i=0;i<10;i++) { // Changed to i2
console.log('b',i);
}
}
a();
放置'使用严格';在每个javascript文件的顶部,你永远不会再发生那种陌生感。现在,在您的Javascript顶部放置'use strict'。您将看到两个i都有错误,因为您使用var
关键字声明它们。
当你开始宣布我在你的第一个循环(i=0;i<10;i++)
时,你把我放在全球范围内:window.i
。因此,两个for循环都使用相同的window.i
变量。
函数b中的第二个for循环不声明新的i
变量,使用全局i变量,因为它是在函数a中创建的。
有一些问题。一个是问题变量i
应该在for循环中声明:
for (i=0;i<10;i++)
应改为
for (let i=0;i<10;i++)
要做的另一个改变是应该在循环外调用b
函数。完整的解决方案是:
function a() {
for (let i=0;i<10;i++) {
console.log('a',i);
}
b();
}
function b() {
for (let i=0;i<10;i++) {
console.log('b',i);
}
}
a();
你使用i的方式导致javascript将其视为全局变量。其他语言默认情况下i变量可能是for循环范围的本地变量,但javascript不能以这种方式工作。 Javascript被设计为默认情况下变量是全局的。您可以使用var将变量范围限制为函数,例如:
function a() {
for (var i=0;i<10;i++) {
console.log('a',i);
b() ; }
}
请注意,这是我对函数的范围,而不是你想要的for循环。您可以使用较新的let关键字来定义具有更精细范围的变量(从ES2015开始)。以下是仅限于for循环的i变量的示例(不是函数):
function a() {
for (let i=0;i<10;i++) {
console.log('a',i);
b() ; }
}
以上是关于为什么'I'在不同的函数中更改嵌套循环?的主要内容,如果未能解决你的问题,请参考以下文章