为什么'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通常是更好的做法。它将帮助您限制局部变量的范围。在上面的例子中,使用leti的范围限制在循环内,而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'在不同的函数中更改嵌套循环?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 分组函数里可以嵌套吗?

sql decode函数里面有多个值怎么办

(python)在While函数中'i = i + 1'的作用是什么?

JavaScript 如何查找嵌套中的element对象

关于C语言宏定义输出

函数嵌套