为了账号安全,请及时绑定邮箱和手机立即绑定

前端面试的一个小问题

前端面试的一个小问题

BIG阳 2019-04-09 20:23:34
昨天去一家公司面试前端,第二轮技术面给我出了一个题varlen=4;while(len--){setTimeout(function(){alert(len);},0);alert(len);}问输出结果当时有点蒙,自己不熟悉setTimeOut函数以为time为0就是立即调用,然后考官说setTimeOut是异步的,即使是0也会在最后执行,结果输出应该为3,2,1,0,-1,-1,-1,-1.后来又变了题目是:varlen=4;while(len--){(function(i){setTimeout(function(){alert(i);},0);})(len);alert(len);}这次我就很清楚了,产生一个闭包,每次len的变化i都保存了一个copy,所以输出是3,2,1,0,3,2,1,0.但是刚才写demo的时候发现第一段代码的输出符合预期,第二段的输出开始4个是3,2,1,0但是后面的也就是setTimeout中的输出有时候都不一样,有时是0,2,1,3有时是2,1,0,3等等求解释。
查看完整描述

2 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

前边那个你理解了?那我只说后边那个——闭包。
(function(i){setTimeout(function(){alert(i);},0);})(len);
这里创建了一个函数并立即调用了,函数的参数i被设置成len现在的值,然后它就不改了。所以它alert的值是0-3而不是-1。
至于顺序,都是延时0毫秒执行,所以顺序是乱的。
                            
查看完整回答
反对 回复 2019-04-09
  • 2 回答
  • 0 关注
  • 447 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信