JavaScript闭包
- 前言
- 概念
- 代码实例以及讲解
- 闭包作用
- 闭包缺点
前言
本文主要讲解JavaScript中的闭包,闭包是什么?
闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical
environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript
中,闭包会随着函数的创建而被同时创建。
概念
简而言之,闭包就是一个函数体内嵌套了一个子函数体,而这个子函数体由于js的上下文作用域关系,它能取到上级函数的变量并且做判断,这就意味着在子函数中,父函数的值并没有被标记清理,而是延申到了子函数中,优点是可以继续使用该函数变量,缺点也很明显,无法判断该变量是否还需要,所以一直无法清理,造成内存冗余和内存泄漏问题。
代码实例以及讲解
示例一:
function father(){let a=1let b=2console.log(a);//1function display(){let b=3console.log(a,b);//1 3}display()console.log(b);//2}father()
上述代码中中display就是father函数的闭包,display函数调用了father函数中的a变量,可以成功调用father函数的a变量,并且定义了一个b变量在diaplay函数中覆盖了father函数中的b变量,覆盖成功,但当跳出diaplay函数后,发现在display中的b变量已经被清理了,在函数头中被定义,在函数尾中被清理,而father函数中的b变量因还没有到达father函数尾就打印,所以它仍旧可以被打印出来。
示例二:
function add(a,b){return function(){a++;return a+b;}
}
let num=add(1,2)
console.log(num());//4
想让两个参数相加,其中第一个参数先加1后相加,那么我们可以通过闭包实现,这个闭包可以放在父函数的返回值中,这样就可以把add(1,2)赋值给一个变量,然后再调用这个变量,则实现了这个效果。
闭包作用
- 隐藏变量
- 延长函数内变量生命周期
- 让函数外部可以调用到函数内部数据
闭包缺点
- 延长了函数内变量生命周期,局部变量没有释放,内存不会被垃圾回收机制回收,导致内存占用时间过长。
- 可能造成内存泄漏
所以要尽量避免使用闭包,且使用闭包时要及时进行释放处理。