这个问题涉及到JS闭包的概念,闭包的概念比较晦涩,以我的表达能力,想要给你讲通不容易,尝试一下吧,希望你能理解我说的。
尽管 i 是存在于块级作用域中,但是 arr[i] 也存在于块级作用域中, 所以 arr[i] 是可以访问到 i的,这个可以理解吧。
当你把一个匿名方法赋值给 arr[i] 时,匿名方法也是可以访问到 i 的,并且在匿名方法的方法体中保存了对 i 的引用,所以尽管for循环结束了,但是,引用依然存在。因为你在定义这个匿名方法的时候就持有了 i。
后期这个i是始终不会被释放的,也就是说会造成我们常说的内存泄露。因为后期尽管你不再调用arr[0]或arr[1]方法,但对i的引用始终存在。就好比是占着茅坑不拉屎,你不用,但是却把坑给占着,导致别人也用不了。这样的话内存就白白的被浪费掉了一个,也就是内存泄露。
好吧,希望你能理解,不懂再问吧
补充:
上面这段代码的原理是一样的。
1、区别:
var定义的变量是全局变量或者函数变量。
let定义的变量是块级的变量。
2、全局变量:
指没有定义在任何函数内,直接定义在全局作用域中的变量。
特点:随处可用,可重用。
何时:希望随处可用,且可反复使用的变量,都要声明在函数之外的全局。
3、局部变量:
指定义在函数内的参数和变量,都是局部变量。
特点:仅函数内可用,出了函数不可用,不可重用。
何时:希望变量只在函数内有效时,都要在函数内创建变量。