js中let的问题?

JavaScript027

js中let的问题?,第1张

这个问题涉及到JS闭包的概念,闭包的概念比较晦涩,以我的表达能力,想要给你讲通不容易,尝试一下吧,希望你能理解我说的。

尽管 i 是存在于块级作用域中,但是 arr[i] 也存在于块级作用域中, 所以 arr[i] 是可以访问到 i的,这个可以理解吧。

当你把一个匿名方法赋值给 arr[i] 时,匿名方法也是可以访问到 i 的,并且在匿名方法的方法体中保存了对 i 的引用,所以尽管for循环结束了,但是,引用依然存在。因为你在定义这个匿名方法的时候就持有了 i。

后期这个i是始终不会被释放的,也就是说会造成我们常说的内存泄露。因为后期尽管你不再调用arr[0]或arr[1]方法,但对i的引用始终存在。就好比是占着茅坑不拉屎,你不用,但是却把坑给占着,导致别人也用不了。这样的话内存就白白的被浪费掉了一个,也就是内存泄露。

好吧,希望你能理解,不懂再问吧

补充:

上面这段代码的原理是一样的。

1、区别:

var定义的变量是全局变量或者函数变量。

let定义的变量是块级的变量。

2、全局变量:

指没有定义在任何函数内,直接定义在全局作用域中的变量。

特点:随处可用,可重用。

何时:希望随处可用,且可反复使用的变量,都要声明在函数之外的全局。

3、局部变量:

指定义在函数内的参数和变量,都是局部变量。

特点:仅函数内可用,出了函数不可用,不可重用。

何时:希望变量只在函数内有效时,都要在函数内创建变量。