当前位置: 代码迷 >> 综合 >> 闭包,我来啦
  详细解决方案

闭包,我来啦

热度:71   发布时间:2023-10-02 03:51:32.0

闭包,我来啦

  • 闭包的概念
  • 闭包的优缺点
    • 解决方案:
  • 闭包常见例子(面试题)
  • 拓展题:将var 改成let 结果会是神马呢?

闭包的概念

闭包可以理解成“定义在一个函数内部的函数“,在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

  相关解决方案