閉包的定義:
閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)
什么時(shí)候使用閉包:
閉包可以用在許多地方,它的最大用處有兩個(gè):
1 可以讀取函數(shù)內(nèi)部的變量,
2 讓這些變量的值始終保持在內(nèi)存中淋叶。
這里給大家普及一下this的相關(guān)問(wèn)題
在全局函數(shù)中this等于window
當(dāng)函數(shù)被當(dāng)做某個(gè)對(duì)象的方法調(diào)用時(shí)围橡,this等于那個(gè)對(duì)象
匿名函數(shù)的執(zhí)行環(huán)境具有全局性,this通常指向window
一般的調(diào)用方法:
var flag = "window";
var object = {
flag : "local",
sayFlag: function(){
alert(this.flag);
}
}
object.sayFlag();//local
改用閉包:
var flag = "window";
var object = {
flag : "local",
sayFlag: function(){
//返回一個(gè)匿名函數(shù)
return function(){
alert(this.flag);
}
}
}
object.sayFlag()();//window
那么如何訪問(wèn)“l(fā)ocal呢”臼膏?
var flag = "window";
var object = {
flag : "local",
sayFlag: function(){
var that = this; //此處的this是object的引用
//返回一個(gè)匿名函數(shù)
return function(){
alert(that.flag);
}
}
}
object.sayFlag()();//local
閉包變量常駐內(nèi)存
var say = function(){
var i = 1;
var sayName = function(){
i++;
alert(i);
}
return sayName;
}
var result1 = say();
result1(); //1
result1(); //2
由于閉包訪問(wèn)外部函數(shù)的i仿畸,外部函數(shù)返回引用閉包函數(shù),所以內(nèi)存不會(huì)被回收呐萌,i值也常駐內(nèi)存馁痴,所以每次執(zhí)行say函數(shù)時(shí),i并不會(huì)重新復(fù)制