闭包是什么
保留局部变量不被释放的代码块,称为一个闭包
在js中,变量的作用域属于函数的作用域,由于函数在执行完毕后就会被清理,内存也会被回收,但是由于闭包是建立在函数内的子函数,其可以访问上级作用域的原因,即使上级函数执行完,作用域也不会随之销毁,这时的子函数,便拥有了访问上级作用域中的变量的权限,即使上级函数执行完后作用域内的值也不会随之销毁。
闭包的作用
知道了闭包是什么,那么闭包到底能做些什么呢?
关于闭包,阮一峰这样说道:闭包就是能够读取其他函数内部变量的函数。在Javascript语言中,只有函数内部的子函数才能读取局部变量,可以把闭包简单的理解成“定义在一个函数内部的函数”。
本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
来看一个例子:
function f(){
let a = 999;
function printNum() {
console.log(a);
}
return printNum
}
let a = f();
a()// 999
上面这个例子反映出了闭包的一个作用:可以访问函数内的变量。
在js中,函数就相当于一个黑盒子,从外界无法访问函数内部的变量,但通过闭包就可以实现这样的操作。
上面的代码就形成了一个闭包,在函数f内定义了一个变量a和一个函数printNum,printNum函数引用了函数f中定义的a,f函数又将printNum函数return了出去,这样在函数外部也可以访问到f函数内的a变量,由于printNum函数保持着对a的引用,因此a这个变量不会被销毁。
通过以上的例子,我们可以总结出闭包的一些特点:
1.持久化函数内的变量
2.将函数内部与外部连接起来
利用闭包
既然知道了闭包的特点,我们怎么利用它呢,这里举两个例子
1.设置缓存
既然可以持久化变量,我们不妨可以将这个变量用作一个缓存,来存储一些东西
cosnt cache = (function() {
const store = []
return {
get = function(key) {
return store[key]
},
set = function(key, value) {
store[key] = value
}
}
}())
cache.set('a', 10)
cache.get('a')
上面的例子定义了一个store,它一直被引用,不会被销毁
2.保护变量
假如有个变量a,很重要,并且在对这个变量进行操作的时候要注意其不能为负数,这时候可以用闭包
cosnt foo= (function() {
const a= 0
return {
add= function(num) {
a+=num
},
reduce= function(num) {
a -= num
if(a < 0) {
// 操作
} else {
// 操作
}
}
}
}())
foo.add(3)
foo.reduce(2)
上面的代码形成了闭包,防止在外部操作a变量时使a变量的值超出范围
闭包需要注意的地方
闭包使得函数中的变量都被保存在内存中,内存消耗很大,滥用闭包会造成网页性能问题,在IE中导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
网友评论