当前位置: 首页 > 知识库问答 >
问题:

javascript - bar函数内部的变量为什么可以遮蔽for循环变量的i?

宫俊才
2023-05-15

题目描述

函数内部命名冲突导致另外一个变量被意外遮盖,导致了无限循环

题目来源及自己的思路

你不知道的js

相关代码

function () {
    function bar() {
        i = 3; //i为啥修改了for循环的i
        console.log( a + i );
        }
     for(var i = 0; i < 10; i++) {
        bar( i * 2 ); //无限循环了
    }

}

你期待的结果是什么?实际看到的错误信息又是什么?

bar 函数内部的变量为什么可以遮蔽 for 循环变量的 i

共有2个答案

岑和风
2023-05-15
function () {
    function bar() {
        i = 3; //i为啥修改了for循环的i
        console.log( a + i );
        }
     for(var i = 0; i < 10; i++) {
        bar( i * 2 ); //无限循环了
    }

}

相当于:

function () {
    var i= 0
    function bar() {
        i = 3; //i为啥修改了for循环的i
        console.log( a + i );
        }
     for( i < 10; i++) {
        bar( i * 2 ); //无限循环了
    }

}

你把你的循环中的var改成let就可以了:

function () {
    function bar() {
        i = 3; //i为啥修改了for循环的i
        console.log( a + i );
        }
     for(let i = 0; i < 10; i++) {
        bar( i * 2 ); //无限循环了
    }

}
史鸿运
2023-05-15

因为for循环和bar函数在同一个作用域下,而使用var声明的变量会提升到整个作用域的顶部,换用let就是另一种情形

 类似资料:
  • 循环变量内建函数从 FreeMarker 2.3.23 版本开始存在。 这些内建函数只能用于list 和 items 指令 的循环变量 (也可以用于已经废弃的 foreach 指令)。 下面是一些说明(loopVar?index 在可以列表的值中进行迭代,返回从0开始的索引): <#-- Note: x is a loop variable --> <#list ['a', 'b', 'c'] a

  • 问题内容: 根据Java语言规范§14.14.2,增强循环的变量必须在循环本地。换句话说,它将编译为: 但这不是: JLS没有为这种语言设计选择提供任何依据。我可以看到如果通过或通过注释修改了局部变量的原因,为什么必须出现类型名称,但是我不明白为什么不允许在其他地方声明的变量的裸名。是否有人对为什么施加此限制有任何见解? 编辑 到目前为止,有几个答案似乎表明,循环之外发生的事情是按这种方式设计语言

  • 问题内容: 我有一个整数数组。 我想为每个X创建一个沿Y迭代的线程。我不知道如何将适当的X值传递给每个线程。 本质上我希望能够做到 任何帮助,将不胜感激 问题答案: 只值可以的方法和本地匿名内部类内被捕获。您需要按以下方式更改代码:

  • 问题内容: 我相信在AS3中,您应该在循环外初始化所有变量,以提高性能。JavaScript也是如此吗?哪个更好/更快/最佳实践? 要么 问题答案: 有 绝对没有区别 意义还是性能,在JavaScript或ActionScript。 是解析器的指令,而 不是 运行时执行的命令。如果在函数体(*)中的任何位置一次或多次声明了特定的标识符,则该标识符在块中的所有使用将引用局部变量。声明是在循环内部,循

  • 我们一直在学习循环和嵌套循环。 我的问题; 为什么增量结束后,内部for循环中变量的值会自动重置?但是,在外部for循环中,变量保持其值。 例如: 在这种情况下,程序运行10次,同时将i和count增量增加到18,然后返回到6?每次。。。有人能解释一下为什么会这样吗?

  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接