“函數(shù)”和“函數(shù)內(nèi)部能訪問到的變量(也叫環(huán)境)”的總和外恕,就是一個閉包俐镐。
JavaScript有兩種作用域:全局作用域和函數(shù)作用域。函數(shù)內(nèi)部可以直接讀取全局變量催式。但是悬而,在函數(shù)外部無法讀取函數(shù)內(nèi)部聲明的變量呜舒。換言之,如果一個函數(shù)笨奠,使用了它范圍外的變量袭蝗,那么‘這個函數(shù)+這個變量’就叫做閉包。
function f1() {
var n = 1;
function f2() {
console.log(n);
}
return f2;
} //這段代碼中般婆,函數(shù) f2 和變量 n 的總和就叫做閉包
閉包的用途:
1.從外部讀取函數(shù)內(nèi)部的變量到腥。
function f1() {
var n = 9;
function f2() {
console.log(n);
}
return f2;
}
var result = f1();
result(); // 9
//這段代碼中,函數(shù)f1的返回值就是函數(shù)f2蔚袍,由于f2可以讀取f1的內(nèi)部變量乡范,所以就可以在外部獲得f1的內(nèi)部變量了配名。
2.讓這些變量始終保持在內(nèi)存中。
function f1(n) {
return function () {
return n++;
};
}
var a1 = f1(1);
a1() // 1
a1() // 2
a1() // 3
//這段代碼中晋辆,閉包使得內(nèi)部變量記住上一次調(diào)用時的運(yùn)算結(jié)果渠脉。
3.封裝對象的私有屬性和私有方法。
function f1(n) {
return function () {
return n++;
};
}
var a1 = f1(1);
a1() // 1
a1() // 2
a1() // 3
var a2 = f1(5);
a2() // 5
a2() // 6
a2() // 7
//這段代碼中瓶佳,a1 和 a2 是相互獨(dú)立的芋膘,各自返回自己的私有變量。