在了解闭包之前,我们要明白什么是作用域:
变量的作用域分为两个:全局作用域和局部作用域
什么是作用域链?
在有嵌套关系的多个函数中,外部的函数不能访问内部函数的变量,而内部函数可以访问外部函数的变量
一、什么是闭包?
我们可以理解为函数嵌套函数,里面被嵌套的那个函数就是闭包函数
形成闭包环境,需要两个条件:(1)函数嵌套 (2)子函数引用父函数的局部变量
function outFun(){
function inFun(){
//这个内部的函数就是闭包函数
}
}
二、闭包函数有什么特点?
- 正常情况下的函数(这里指非闭包函数)在函数被调用之后函数内的变量都会被销毁(释放内存空间),但是闭包函数不会。
- 内部函数可以引用外部函数的参数和变量
- 函数内再嵌套函数
function outFun(){
let a = 10;
function inFun(){
console.log(a);
}
return inFun;
}
let fun = outFun()
fun();//调用外部函数
三、闭包有什么应用?
- 设计模式中的单例模式
- for循环中的保留i的操作
- 防抖和节流
- 函数柯里化
封装一段代码,实现模块化
let fun = (function(){
let a=1;
let b=2;
function sum(){
return a+b;
}
function sub(){
return a-b;
}
return{
sum,
sub
}
})()
let res1 = fun.sum;
let res2 = fun.sub;
console.log(res1);
console.log(res2);
四、闭包的优缺点
- 优点:可以避免全局变量的污染
- 缺点:(1)内存消耗大 ,不能滥用否则会导致ie页面的内存泄漏,解决方法:再退出函数前,将不用的局部变量删除;(2)闭包在父函数外部,会改变父函数内部的局部变量的值