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

对于javascript里的块作用域不是很理解,比如下面的这段代码为什么会输出5个6?

对于javascript里的块作用域不是很理解,比如下面的这段代码为什么会输出5个6?

守着一只汪 2018-10-19 15:14:16
for(var i=1;i<=5;i++){        setTimeout(function timer(){             console.log(i);         },i*1000);     }
查看完整描述

1 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

首先js没有严格意义的块作用域,块作用域可以用一个立即调用的函数来模拟

然后你的这段代码和块作用域无关,这是一个js闭包的问题,所谓闭包就是可以访问另一个函数作用域中变量的函数,所以这里的setTimeout是一个闭包,它在for语句所在的作用域被调用,在它内部可以访问for语句中定义的(但不是在它自己作用域内)变量i,这是因为闭包保存了包含函数的整一个变量对象

所以,i从1到5,循环体执行5次,当最后因为i变为6跳出循环时,因为闭包引用的是外部作用域的整一个变量对象,也就引用了外部的这个i,所以每次输出的这个i就是外部的i,就是6

于是就是5次6


查看完整回答
反对 回复 2018-11-06
  • 1 回答
  • 0 关注
  • 535 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号