- 官方解释 闭包是由函数及声明该函数的环境组合而成。
通俗的讲就是,我们声明一个函数时候,除了函数本身,可能还会存在一些函数所使用的外部变量或方法等环境。 将这个函数以及设计到的所有外部变量,方法等一些封装为一个函数提供给外部使用,称这个为闭包。
比如我存在一个函数:
let count = 0;
let label = ""
let g = (): string => {
count++;
label += count
return label;
}
该函数主要对一个全局变量count做加1运算,且将每次运算结果相连接返回结果。
如果我们调用多次函数g(),那么前后两次返回的值不同。
g() // 1
g() // 12
g() // 123
如果我们存在两个场景,分别想要统计各个场景调用函数g的次数,我们可能常规的处理方法是将上述代码逻辑封装到一个类中,然后分别为这两个场景各定义一个对象,通过分别统计这两个对象中的count值来统计调用次数。
对于闭包,我们可以将上述这些代码逻辑封装为一个新函数,如下:
function f(): () => string {
let count = 0;
let label = ""
let g = (): string => {
count++;
label += count
return label;
}
return g;
}
然后分别在两个场景中各声明一个对函数的引用,接着调用函数,也可以实现该功能。对于这个方法f(),称之为闭包。里边包含了一个函数,以及该函数涉及到的环境。
let f1 = f();
f1() // 输出:1
f1() // 输出:12
let f2 = f();
f2() // 输出:1