《你不知道的javascript》循环和闭包的案例

查看:77
本文介绍了《你不知道的javascript》循环和闭包的案例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

for(var i=1;i<=5;i++){
   setTimeout(function timer(){
       alert(i);
   },i*1000);
}
在《你不知道的javascript》中,是这么描述这段代码的:
缺陷是我们试图假设循环中的每个迭代在运行时都给自己"捕获"一个i的副本。但是根据作用域的工作原理,
实际情况是尽管循环中的五个函数是在各个迭代中分别定义的,但是它们都被封闭在一个共享的全局作用域中,
因此实际上只有一个i.

疑问:
只有一个i(为啥i是6)?
能不能这么理解?在函数的5次迭代中,每一次在迭代运行时都给自己捕获了一个i的副本。i排序也就是
1,2,3,4,5,6;但是,又根据作用域的工作原理(词法作用域的查找规则),这6个i中只能是其中一
个i,最后根据i所出现的顺序的先后,6是出现在排序中的最末位,所以这唯一一个i就是6.


解决方案

第一次进入循环后,设置一个定时器,将Timer函数传入,但此时并不执行,继续往下进入第二次循环。当循环结束之后i=6。然后定时器触发,发现函数中用到i变量,于是浏览器从当前作用域往上找,发现有i变量,值等于6.于是传入的i都等于6

这篇关于《你不知道的javascript》循环和闭包的案例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆