闭包是什么?
概念:能够读取到其他函数内部变量的函数
函数外部无法访问函数的局部变量,但函数内部函数可以访问本函数内的局部变量,故通过闭包实现函数外部访问函数内部局部变量。但容易造成内存泄漏,应当谨慎使用。
例如:
function Foo(){
var i = 1
return function(){
console.log(i++)
}
}
let f1=Foo()
let f2=Foo()
f1() // 0
f1() // 1
f2() // 0
一般来说函数执行完后其局部变量就会随着函数调用结束被销毁,但是Foo函数返回了匿名函数的引用即闭包它可以访问到foo()被调用的生产环境,局部变量i一致处于这个环境中才可能被访问到,只要有一个黄静有可能被访问到,它就不会被销毁,所以闭包由延续变量的作用
闭包的使用场景
1、setTimeout
原生的setTimeout第一个函数不能带参数,通过闭包可以实现传参
function a(param){
return function(){
console.log(param)
}
}
setTimeout(a(1),1000)
2、封装私有变量
function Person(){
var age= 1;
this.getAge:function(){
return age;
}
this.setAge:function(value){
age= value;
}
this.ageIcr.function(){
age++
}
}
let p = new Person()
console.log(p.getAge())//1
console.log(p.setAge(10))
console.log(p.getAge())//10
console.log(p.ageIcr())
console.log(p.getAge())//11