- 定義
閉包是在另一個函數(稱為父函數)中定義的函數,並且可以訪問在父函數作用域中聲明和定義的變量。
閉包可以訪問三個作用域中的變量
1、在自己作用域中聲明的變量
2、在父函數中聲明的變量
3、在全局作用域中聲明的變量
var globalVar = "abc";
//自調用的函數
(function fatherFunction(fatPart){ //父函數fatherFunction作用域開始
var fatVar = 'F'; //在父函數中聲明的變量
//自調用函數
(function childrenFunction(chiPart){ //子函數children作用域開始
var chiVar = 'C'; //在子函數中聲明的變量
console.log(
"父函數參數:" + fatPart +
"父函數中聲明:" + fatVar +
"子函數參數:" + chiPart +
"子函數聲明:" + "chiVar" +
"全局聲明:" + global;
)
})(5) //子函數作用域結束,將5作為參數
})(7) //父函數作用域結束,將7作為參數
//父函數參數:7
//父函數中聲明:F
//子函數參數:5
//子函數中聲明:C
//全局聲明:abc
childrenFunction 是在 fatherFunction 中定義的閉包,可以訪問在 fatherFunction 作用域內聲明和定義的變量。此外,閉包還可以訪問在全局命名空間中聲明的變量。
- 應用
編寫一個可以實現如下操作的函數
var biBao = F(6);
biBao(10); //返回16
biBao(20); //返回26
可以創建一個閉包來存放傳遞給函數 F 的值。被返回的內部函數是在外部函數中創建的,內部函數就成了一個閉包,它可以訪問外部函數中的變量。本例中變量 (父函數作用域中的變量) 是 number
function F(number){
return function(a){
console.log(number + a);
}
}
var biBao = F(6);
biBao(10); //16
biBao(20); //26
