函数即是闭包
闭包指的函数能够读取其外部环境的变量和参数的能力。JS中,一切函数都是闭包
最典型的写法
应用闭包的最典型写法,是在函数中返回另一个函数(即内函数,它有读取outer函数的变量和参数的能力)
//写法 1 返回一个匿名内函数
functin outer() {
let varible = 0;
return function() {
//use varible
}//
}
//写法 2 返回一个有名字的内函数
functin outer() {
let varible = 0;
function inner() {
//use varible
}
return inner;
}
调用:
let func = outer();
func();
闭包(内函数)起到的作用:
调用outer时,由outer返回一个内函数(func),由于内函数存在,外函数的变量和参数会保留在内存中为内函数所用。我们把内函数需要用到的变量定义在外函数中,有两个好处:第一,可以缩小变量的作用域,只有内函数有能力对其修改更新,避免定义在全局变量中被任何人修改;第二,每次调用外函数,变量都会缓存在内存当中,且互不干扰。接下来我们用实际应用来验证闭包这两个好处。
实际应用:计数器 Counter
普通写法:
let count = 0;
function counter() {
count++;
console.log(count);
}
counter(); //1
counter(); //2
闭包(内函数)写法:
function counter() {
let count = 0;
return function() {
count++;
console.log(count);
return count;
}
}
let counter1 = counter();
counter1(); //1
counter1(); //2
let counter2 = counter();
counter2(); //1
counter2(); //2
可以看出闭包(内函数)的写法的好处:
- count 定义在函数内,避免定义在了全局范围中,只能通过内函数来修改他,避免被任意修改的风险。普通写法除了 counter 函数修改,任何人都可以访问并修改 count 的值,这是十分错误的写法。
- counter 函数能重复使用,每次调用counter,都是一个新的计数器(count 从0开始),每个计数器的 count 值都被缓存在内存当中,且互不干扰,而这是普通写法做不到的。