解决setTimeout产生的闭包问题

一般来说,这段代码,绝对不是理想的

for (var i = 0; i < 6; i++) {  setTimeout(() => {    console.log(i);  }, 1000);}

打印成这样

9cc592b0dbe445458dfae914179a9346.png

先说两种解决方法:let和setTimeout的第三个参数

c7bd7281e12c46478aaffedc460ceb34.png

另一种是let

for (let i = 0; i < 6; i++) {  setTimeout(() => {    console.log(i);  }, 1000);}

54d6294971b24a0e83297ca32b504aec.png



最后一种立即执行函数

for (let i = 0; i < 9; i++) {  (function (i) {    setTimeout(() => {      console.log(i);    }, 2000);  })(i)}

9fd63c935e724dbe807353fd5ade0f98.png

 虽然这种方法可以解决,但是会产生闭包!因为settimeout里的函数用到了当前非作用域的i

fed6f749e7754c7ead14156257414a67.png

如何验证?

5eb13f6bc4e340b495d32acb28b30c44.png

不敢意思图片打错字了,是用完就丢,这样就不会驻扎在内存里了81aa98134dcb4c519df451baef23297d.png 

 所以刚刚那个for循环如果用到立即执行函数,产生闭包记得要设置为null哦

for (let i = 0; i < 9; i++) {  (function (i) {    setTimeout(() => {      console.log(i);      i = null;//记得这句    }, 2000);  })(i)}

不知有没有说错

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值