关于闭包

通俗易懂的讲,在C#中,闭包使用类实现,闭包函数变成了一个类,闭包中使用的变量(其定义域外的)变成了其成员变量,修改这个变量就是修改其成员变量,这样也就可以理解为什么修改闭包定义域以外的变量运行结果也会变化。

所以可以将闭包称为有状态的函数。

https://www.bilibili.com/video/BV1sY4y1U7BT

下面是js中的典型闭包:

1
2
3
4
5
for(var i=0;i<10;i++) {
setTimeout(()=>{
console.log(i)
},1000)
}

那么如何避免闭包呢?

如果不使用语言特性,那么我们需要另外一个变量保持每一次的状态。

但是在js中var有变量提升,直接用var是错误的。需要使用let。

1
2
3
4
5
6
for(var i=0;i<10;i++) {
let temp=i;
setTimeout(()=>{
console.log(temp)
},1000)
}

使用语言特性,我们在遍历的时候就可以使用let

1
2
3
4
5
for(let i=0;i<10;i++) {
setTimeout(()=>{
console.log(i)
},1000)
}