闭包 注释:闭包就是能够读取其他函数内部变量的函数。
怎么理解闭包
1. 闭包是一个函数;
2. 通过这个函数我们可以获取其他函数的内部变量。
内部函数可以通过作用域链访问到外部函数的局部变量。请看代码
function f1() {
let i = 0;
function f2() {
console.log(i); //0
}
}
在f2中,我们可以通过“作用域链”找到f1中的局部变量i。如果我们将f2作为一个返回值进行返回,在外部调用f2,是不是就可以在外部实现对内部函数的局部变量的调用。下面我们再看代码。
function f1() {
let i = 0;
function f2() {
console.log(++i);
}
return f2;
}
let fn2 = f1();
fn2(); //1
fn2(); //2
闭包的用途与作用
闭包作用主要有两个方面:
1. 访问内部函数的局部变量;
2. 将变量保存在内存中。
平时在工作中主要应用在第二个用途:将变量保存在内存中。
例如防抖函数实现中,对定时器变量的存储:
function f1(fn, wait) {
let timer = null;
let context = null;
return function f2() {
context = this;
!timer && fn(context, ...arguments);
if (timer) {
clearTimeout(timer);
timer = null;
}
timer = setTimeout(() => {
clearTimeout(timer);
timer = null;
}, wait);
}
}
let fn = f1(() => {}, 2000);
为什么timer这个局部变量不会被销毁。是因为f2被赋值给了一个全局变量,并且f2调用了f1的局部变量,所以造成f1也不会被销毁。