1、什么叫闭包?
一个作用域可以访问另外一个函数内部的局部变量 ,或者说一个函数(子函数)访问另一个函数(父函数)中的变量。 此时就会有闭包产生 ,那么这个变量所在的函数我们就称之为闭包函数。比如下面例子:
function makeFn(){
var name = "Mirror";
function showName(){
alert(name)
}
return showName;
}
var myFn = makeFn();
myFn(); // "Mirror"
在以上的例子中,myFn是执行makeFn时创建的showName函数实例的引用,而showName实例仍可访问其词法作用域中的变量,既可以访问到name。 由此,当myFn 被调用时,name仍可被访问。
2、闭包的优点?
避免全局变量的污染,
3、闭包的缺点?
如果使用不当会造成内存泄露的问题,什么叫内存泄露?就是指用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。那怎么解决内存泄露问题呢?就是在使用完这个函数或是变量使用完成后及时的销毁掉就可以了。
4、闭包的三个特征:
(1)函数嵌套函数
(2)函数内部可以引用函数外部的参数跟变量
(3)参数跟变量不会被我们JS中的垃圾回收机制回收。
5、闭包的使用场景:
(1)防抖与节流
// 节流函数封装
function throttle(func, delay) {
let timer = null;
return function () {
if (!timer) {
timer = setTimeout(() => {
func.apply(this, arguments);
timer = null;
}, delay);
}
};
}
// 防抖函数封装
function debounce(func, delay) {
let timer = null;
return function () {
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(this, arguments);
}, delay);
};
}
(2)函数柯里化:
JavaScript函数柯里化是一种将使用多个参数的函数转换为一系列使用一个参数的函数的技术。
//柯里化前
function add(a, b, c) {
return a + b + c;
}
console.log(add(1, 2, 3)); //6
//柯里化后
function addCurried1(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
//箭头函数简写
const addCurried2 = (a) => (b) => (c) => a + b + c;
console.log(addCurried1(1)(2)(3)); //6
console.log(addCurried2(1)(2)(3)); //6