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

题目描述

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

题目来源及自己的思路

你不知道的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

阅读 1.6k
2 个回答

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

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 ); //无限循环了
    }

}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题