闭包:函数嵌套函数,内部函数innerFun就是闭包
function outerFun(){
function innerFun(){
consol.log(a);
}
return innerFun;//返回值为内部函数(闭包)
}
let fun = outerFun();//
fun();//输出10
内部函数是否可以访问到a,了解作用域链
正常情况下,函数执行完成之后,内部变量会销毁(释放内存空间)
销毁
function fun(){
let a = 10;
consol.log(a);
}
fun()
执行过程中可以获得a的值,执行结束之后变量a会被释放
闭包:内部函数没有执行完成,外部函数变量不会销毁
闭包的条件:
- 函数嵌套函数
- 内部函数使用外部函数的变量
- 调用外部函数
闭包到底是什么:
- 通俗的理解:函数内部嵌套的函数
- 浏览器查看后理解:内部函数的Scopes中,包含引用外部函数变量的一个对象
闭包的作用:
- 延长了局部变量的生命周期
- 在外部控制局部变量
闭包的缺点:
- 局部变量会长期驻留在内存中,可能会造成内存泄漏(IE9以下)
解决闭包带来的缺点:
- 减少使用闭包
- 及时释放
闭包的应用
封装代码
let a = 10;
let b = 20;
function add(){
return a+b;
}
function sub(){
return a-b;
}
let result1 = add();
let result2 = sub();
console.log(result1);
console.log(result2);
定义两个全局变量和两个全局函数,使用闭包进行封装
闭包代码的封装实现
let module = (function(){
let a = 10;
let b = 20;
function add(){
return a+b;
}
function sub(){
return a-b;
}
}) ()
//立即执行函数:用一个括号把一个fun放进去,后面再加一个小括号
return{
add:add,
sub:sub
//add,
//sub
//ES6语法所提供的简写
}
let result1 = moudle.add();
let result2 = moudle.sub();
console.log(result1);
console.log(result2);