【笔记】JS循环与闭包的一个应用

非常常见的代码
此段代码 并不会以 100ms的间隔 打印 1、2、3、4、5

1
2
3
4
5
6
7
8
for(var i = 1; i<=5; i++){
setTimeout(
function delay(){
console.log(i)
},
i*100
)
}

然鹅这样做就好惹:我们引入一个函数作用域,并在该作用域中建立变量i的本地副本。

1
2
3
4
5
6
7
8
9
10
for(var i=1; i<=5; i++){
(function(j){
setTimeout(
function delay(){
console.log(j)
},
j*100
)
})( i )
}

将变量i作为参数传入,并将其复制到IIFE全局变量j中,

IIFE会针对每次迭代创建新的作用域,使用正确的值来更新局部变量。