閉包是什么?
概念:能夠讀取到其他函數內部變量的函數
函數外部無法訪問函數的局部變量,但函數內部函數可以訪問本函數內的局部變量,故通過閉包實現函數外部訪問函數內部局部變量。但容易造成內存泄漏,應當謹慎使用。
例如:
function Foo(){
var i = 1
return function(){
console.log(i++)
}
}
let f1=Foo()
let f2=Foo()
f1() // 0
f1() // 1
f2() // 0
一般來說函數執(zhí)行完后其局部變量就會隨著函數調用結束被銷毀,但是Foo函數返回了匿名函數的引用即閉包它可以訪問到foo()被調用的生產環(huán)境,局部變量i一致處于這個環(huán)境中才可能被訪問到,只要有一個黃靜有可能被訪問到,它就不會被銷毀,所以閉包由延續(xù)變量的作用
閉包的使用場景
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