新聞中心
閉包(closure)是Javascript語言的一個(gè)難點(diǎn),也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。當(dāng)兩個(gè)函數(shù)發(fā)生嵌套,內(nèi)部函數(shù)使用外部函數(shù)的變量或者參數(shù)就會(huì)形成閉包。形成閉包之后,內(nèi)部函數(shù)的變量將會(huì)被保存在對(duì)應(yīng)的函數(shù)內(nèi)存中,不會(huì)像上面代碼中內(nèi)部函數(shù)變量被及時(shí)清除。

官方解釋說完后,我們先來看一個(gè)簡單計(jì)數(shù)的例子.
var c = 0;
function count(){
c++;
}
count();// 1
count();// 2
這個(gè)例子是利用了全局變量來實(shí)現(xiàn),但是這里有個(gè)問題是,c這個(gè)變量也容易被其他方式所調(diào)用,這時(shí)候就可能會(huì)改變 c 的存儲(chǔ)值.造成這個(gè)count計(jì)數(shù)的失效.那怎么很好的處理這個(gè)問題呢!我們會(huì)想到的是使用局部變量的方式來處理.比如:
function count(){
var c = 0;
function add(){
c++;
}
add();
}
count();// c = 1
count();// c = 1
因?yàn)檫@樣創(chuàng)建之后,內(nèi)部變量只存在于count函數(shù)創(chuàng)建執(zhí)行的時(shí)候,執(zhí)行完之后,整個(gè)函數(shù)就會(huì)被丟棄掉.就無法達(dá)到有記憶的能力.那要怎么來實(shí)現(xiàn)呢?那我們就用閉包來解決.我要重新提一次:閉包 = 函數(shù) + 環(huán)境
function count(){
var c = 0;
function add(){
c++;
}
return add;
}
var ct = count();
ct(); // c = 1
ct(); // c = 2
這個(gè)時(shí)候我們就可以通過這個(gè)閉包來完成計(jì)數(shù)的能力.ct就是一個(gè)閉包函數(shù),內(nèi)部的環(huán)境就是這個(gè)局部變量 c. 這里我們達(dá)到的就是內(nèi)部數(shù)據(jù),外部來操作.那閉包除了這個(gè)還有什么其他功能呢?
用閉包模擬私有方法
這有點(diǎn)像Java的私有方法或者私有變量,只能允許自己來操作!如果外部操作,就需要設(shè)定公開的方法來操作.
var person = (function(){
var _name = "編程的人";
var age = 20;
return {
add:function(){
age++;
},
jian:function(){
age--;
},
getAge:function() {
return age;
},
getName:function(){
return _name;
},
setName: function (name) {
_name = name;
}
}
})();
person.add();
var age = person.getAge();
console.log(age)
person.setName("編程的人公眾號(hào):bianchengderen")
console.log(person.getName())
這里應(yīng)該很容易理解了吧! 有點(diǎn)面向?qū)ο缶幊痰母杏X.當(dāng)然Javascript現(xiàn)在也有面向?qū)ο缶幊痰奶攸c(diǎn).這點(diǎn)我們以后來說明.
分享文章:講解一下Javascript中的閉包
當(dāng)前地址:http://m.fisionsoft.com.cn/article/cddsoep.html


咨詢
建站咨詢
