如何快速判斷是否是閉包?
閉包有以下三個特色
1.閉包必定有嵌套函數
2.內層函數必定操做了外層函數的局部變量
3.外層函數必定將內層函數返回外部,而且被全局變量保存
複製代碼
在作關於閉包的題時,記住如下兩個原則
1.外層函數被屢次調用,都會建立新的做用域。也就是說內層函數操做的外層函數的局部變量相互之間是不會影響的
2.外層函數返回的內層函數被調用幾回,內層函數操做的外層函數的局部變量就變化幾回
例:
function outer() {
var i = 0;
return function(){
return i++
}
}
var getNum=outer()//外層函數第一次被調用
console.log(getNum())//0
console.log(getNum())//1
var getNum1=outer()//外層函數第二次被調用,建立新的做用域,和第一次被調用中的i互不影響
console.log(getNum1())//0
console.log(getNum1())//1
console.log(getNum1())//2
console.log(getNum1())//3
下面的例子不是閉包,由於外層函數返回的內層函數傳入了形參i
function outer() {
var i = 0;
return function(i){
return i++
}
}
var getNum=outer()//外層函數第一次被調用
console.log(getNum())//NaN
console.log(getNum())//NaN
var getNum1=outer()//外層函數第二次被調用,建立新的做用域,和第一次被調用中的i互不影響
console.log(getNum1())//NaN
console.log(getNum1())//NaN
console.log(getNum1())//NaN
console.log(getNum1())//NaN
function outer() {
var arr = []
for(var i=0;i<3;i++){
arr.push(function () { return i })
}
return arr
}
var getFunction = outer()
console.log(getFunction[0]())//3
console.log(getFunction[1]())//3
console.log(getFunction[2]())//3
複製代碼