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里的函数会在循环结束之前执行?
展开
展开全部
闭包函数的一个主要特点就是它能够访问其他函数(通常是指包含它的那个函数)作用域内的变量,由于存在这种关系,所以当闭包函数定义后,它所要访问的变量所在的函数也会一起保留在内存中(准确来说保留的是执行环境,而且是以堆栈的方式保存的),当闭包函数运行时它就可以读取到这个变量值,而且这个值是在闭包函数被定义时候的值(即使这个变量的值在闭包函数定义后发生了改变)。打个比方,你有三个孩子,你答应给每个孩子数额不等的零花钱(比如大儿子100,二儿子80,小儿子50),但不是立刻给,要过一段时间再给,那么在这个等待的时间里,孩子们与零花钱数额的对应关系是不会变的,当他们来跟你要钱时就能获得你当初承诺的金额了。闭包的情况也一样,在一个for循环中,循环变量i从0递增到4,循环体内创建了5个闭包函数,它们所能访问到的i的值,就是它们创建时的i值(即0、1、2、3、4),而不是循环结束后的5。所以,你再去看看你题目中所说的两种方法,是不是就能理解了呢?
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |