天天看点

JavaScript系列—for循环,闭包,作用域等

题外话 for循环

一下打印10

JavaScript系列—for循环,闭包,作用域等

测试题

<ul>
<li>111111111111111111</li>
<li>222222222222222222</li>
<li>333333333333333333</li>
</ul>
           
JavaScript系列—for循环,闭包,作用域等

不管点哪个li都会弹出3,因为for循环结束的时候,下面的还没有执行,只有去点的时候才会去执行,但是点的时候,for循环已经结束,所以会弹出3。

可以用闭包解决。内部函数可以调用外部函数传进来的参数i,而外部函数执行完毕也不会影响到内部函数。点哪个弹哪个。

JavaScript系列—for循环,闭包,作用域等

也可以这样写,因为循环的时候i已经被驻扎在内部了,所以点击的时候取得是放在内存中的i,而不是外面的i

JavaScript系列—for循环,闭包,作用域等

测试题

JavaScript系列—for循环,闭包,作用域等

选A

解析:首先转换一下,看起来更清晰

JavaScript系列—for循环,闭包,作用域等

首先setTimeout是一个干扰,可以转化成这个

JavaScript系列—for循环,闭包,作用域等

首先理解一下作用域链

JavaScript系列—for循环,闭包,作用域等
JavaScript系列—for循环,闭包,作用域等

运行后

JavaScript系列—for循环,闭包,作用域等

现在来说闭包

JavaScript系列—for循环,闭包,作用域等

什么是闭包,下面f2就是一个闭包

JavaScript系列—for循环,闭包,作用域等

首先写一个例子

JavaScript系列—for循环,闭包,作用域等
JavaScript系列—for循环,闭包,作用域等

 然后在页面中随便点击那个按钮发现都会打印5

其实原因是在我进行点击的时候for循环已经执行完了,onclick相当于一个异步事件。其实按下面这样写会更清晰

JavaScript系列—for循环,闭包,作用域等
JavaScript系列—for循环,闭包,作用域等

现在让他如何变成0,1,2,3,4呢,看下面

JavaScript系列—for循环,闭包,作用域等
JavaScript系列—for循环,闭包,作用域等

然后我们继续添加代码

JavaScript系列—for循环,闭包,作用域等

分别点击按钮

JavaScript系列—for循环,闭包,作用域等

测试题

JavaScript系列—for循环,闭包,作用域等

答案是

JavaScript系列—for循环,闭包,作用域等

关于垃圾回收机制。当这个作用域中所有的数据都不被调用了,那就要被垃圾回收机制收回

JavaScript系列—for循环,闭包,作用域等

下面就会出现三个1

JavaScript系列—for循环,闭包,作用域等

关于作用域

测试题

JavaScript系列—for循环,闭包,作用域等

当我点击页面时,会弹出3个3

换成let

JavaScript系列—for循环,闭包,作用域等

会出现0,1,2

测试题

JavaScript系列—for循环,闭包,作用域等

测试题

JavaScript系列—for循环,闭包,作用域等
JavaScript系列—for循环,闭包,作用域等

如何解释上面呢,知乎这个解释的最好

JavaScript系列—for循环,闭包,作用域等

测试题

JavaScript系列—for循环,闭包,作用域等