js中的for循环+setTimeout代码到底怎么执行的?

我用闭包写了两个代码,结果都是0,1,2,3,4。第一个方法我还能理解一点,就是每次循环到varb=a(i);时,变量i保存到只有函数b能访问到的地方(之前学闭包的时候学... 我用闭包写了两个代码,结果都是0,1,2,3,4。第一个方法我还能理解一点,就是每次循环到var b=a(i);时,变量i保存到只有函数b能访问到的地方(之前学闭包的时候学的,不知道对不对),成了一个新的变量。不过我不懂的是5次循环之后,函数b被创建了5次,应该只保留了最后一次。最后执行的时候,b函数能访问到的i也只是4。第二个方法我就完全不懂了,不管再怎么闭包,setTimeout里的函数都是最后for循环结束之后再执行,此时i已经变成了5,难道setTimeout里的函数会在循环结束之前执行? 展开
 我来答
网海1书生
2019-08-08
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部
闭包函数的一个主要特点就是它能够访问其他函数(通常是指包含它的那个函数)作用域内的变量,由于存在这种关系,所以当闭包函数定义后,它所要访问的变量所在的函数也会一起保留在内存中(准确来说保留的是执行环境,而且是以堆栈的方式保存的),当闭包函数运行时它就可以读取到这个变量值,而且这个值是在闭包函数被定义时候的值(即使这个变量的值在闭包函数定义后发生了改变)。打个比方,你有三个孩子,你答应给每个孩子数额不等的零花钱(比如大儿子100,二儿子80,小儿子50),但不是立刻给,要过一段时间再给,那么在这个等待的时间里,孩子们与零花钱数额的对应关系是不会变的,当他们来跟你要钱时就能获得你当初承诺的金额了。闭包的情况也一样,在一个for循环中,循环变量i从0递增到4,循环体内创建了5个闭包函数,它们所能访问到的i的值,就是它们创建时的i值(即0、1、2、3、4),而不是循环结束后的5。所以,你再去看看你题目中所说的两种方法,是不是就能理解了呢?
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式