一、阻止垃圾回收机制
在js中,闭包可以理解为能够访问其他函数内部变量的函数,常见的闭包如下
function fn() {
let a = 0;
return function () {
console.log(++a);
}
}
let f = fn();
f(); // 1
f(); // 2
其中,被包含在fn函数中,并被返回的函数就是一个闭包函数。由于作用域链的特性,内层函数可以访问外层函数的变量,所以闭包函数访问了fn中的变量a,并被全局变量f引用。js的垃圾回收器会在函数执行结束之后清除不再被引用的变量,而在fn执行之后,由于变量a在全局作用域中被引用,所以垃圾回收机制不会作用于变量a,即如果我们不手动清除,a会一直存在内存中。这就是闭包的特性之一,可以阻止垃圾回收机制。
二、创建私有变量
function privateValue() {
var value;
this.set = function(v) {
value= v;
};
this.get = function() {
return value;
};
}
var x = new privateValue();
x.set("haha");
console.log(x.value); // undefined
console.log(x.get()); // haha
在js中,外层函数是无法读取内层函数的变量的。利用闭包的特性,我们可以实现设置并获取函数内部变量,以此达到创建私有变量的效果。
三、避免污染全局变量
在写原生js或者jQuery代码时,可能会遇到变量重复命名导致冲突的情况,我们可以利用闭包来避免。
var a = 0;
(function() {
var a = 1;
console.log(a); // 1
})()
console.log(a); // 0
四、防抖的应用
function debounce(fn, delay = 500) {
let timer = null;
return function() {
if (timer) {
clearTimeout(timer);
timer = null;
}
timer = setTimeout(() => {
fn();
}, delay);
}
}
function fn() {
console.log('哈哈哈');
}
setInterval(debounce(fn), 1000)
防抖是用户快速操作的情况下,对性能的优化的一种方案,它规定只能在用户停止操作的一段时间后才执行,也是利用了闭包的特性,将定时器存储在内存中。