js闭包会把想要改变的属性隐藏在函数内,则外界完完全全是没有办法访问到那个属性的,只有在该函数返回的另一个函数中访问得到,这是由于js函数作用域链的缘故。
一般我们使用闭包不外乎几个原因:
- 将变量隐藏,防止外部访问,利用闭包作为唯一的操作数据的接口
- 减少全局变量的使用,而用闭包变量缓存数据
我们一般使用一个对象去接收也就是获取返回函数的引用,如下是多次调用原函数和使用对象接收的区别
- 使用原函数
let f = function(){
let test = 0;
return function(){
console.log(++test)
}
}
f()(); //1
f()(); //1
f()(); // 1
- 使用对象接收
//用同一个变量去接收闭包返回的函数,在执行那个变量函数
let f = function(){
let test = 0;
return function(){
console.log(++test)
}
}
let func = f();
func(); //1
func(); //2
func(); //3
故多次执行原函数即多次执行重置变量的过程,并不能起到我们需要的缓存变量的功能,所以应该用一个对象获取原函数返回的函数。
注意,当返回的函数使用了这个属性时,该属性就不会被自动清除了,除非没有对象接收这个函数的引用了,这个函数和函数所形成的闭包也就会被一并销毁。具体方法就是将接收对象赋值为另一个对象(如空对象)或者null,则闭包就释放了。
let f = function(){
let test = 0;
return function(){
console.log(++test)
}
}
let func = f();
func(); //1
func(); //2
func(); //3
func = null //此时func对象已更换引用对象,上次执行的f()被回收
//为了证明被回收,我们可以再将其引用回来,如下
func = f();
func(); //1
func(); //2
func(); //3