闭包的概念
闭包可以理解成“定义在一个函数内部的函数“,在javascript中,只有函数内部的子函数才能读取局部变量。
闭包的优缺点
1. 说到闭包就会用到全局变量和局部变量
全局变量: 可复用性强,但是会造成变量会被污染。
局部变量: 仅函数内可用,变量不会被污染。但是不可重用
2. 闭包的形成
1. 用外层函数包裹要保护的变量和内层函数。
2. 外层函数将内层函数返回到外部。
3. 调用外层函数,获得内层函数的对象,保存在外部的变量中,所以会比普通函数占用更多的内存。
解决方案:
闭包不在使用时,要及时释放。
将引用内层函数对象的变量赋值为null。
闭包常见例子(面试题)
for(var a =1; a<=5; a++){
setTimeout(function closure(){
console.log(a)
}, a);
}
小伙伴们猜一猜输出的结果是什么?
答案:5次6
讲解:
首先解释下6的来历,上述循环的终止条件是a 的值为6
其次解释下为什么是5次6呢?延迟函数的回调会在循环结束后在执行的,当定时器setTimeout执行时,即使每个迭代中智行的setTimeout(…,0),所有的回调函数依然是在循环结束之后才会被执行的,所以每次都会输出一个6
拓展题:将var 改成let 结果会是神马呢?
for(let a =1; a<=5; a++){
setTimeout(function closure(){
console.log(a)
}, a);
}
结果是:
1
2
3
4
5