Javascript匿名函數(shù)的一種應(yīng)用 代碼封裝
更新時(shí)間:2010年06月27日 01:41:30 作者:
說實(shí)話,對(duì)于js初學(xué)者的我來說。這個(gè)東西太嚇人了,在這些JS庫中,這個(gè)函數(shù)基本上把整個(gè)庫的所有代碼全括起來了,這種寫法完全超越了我的常識(shí)。
在一些Javascript庫中可以看見這種寫法:
(function(){
//所有庫代碼代碼
})();
說實(shí)話,對(duì)于js初學(xué)者的我來說。這個(gè)東西太嚇人了,在這些JS庫中,這個(gè)函數(shù)基本上把整個(gè)庫的所有代碼全括起來了,這種寫法完全超越了我的常識(shí)。難道不應(yīng)該好好的劃分一下嗎,難道不應(yīng)該體現(xiàn)出層次和功能劃分嗎,怎么會(huì)一個(gè)函數(shù)搞定呢。我一開始完全不敢去細(xì)想它的道理。直到使用JS一段時(shí)間后,某一天一位同事在閑聊時(shí)說起了這個(gè)問題,我才知道這個(gè)叫匿名函數(shù)。匿名函數(shù)我并不陌生,C#,Python,Lua中都有這個(gè)咚咚。我到網(wǎng)上去查了一下,介紹文章很多,也很詳細(xì),但是我心頭的疑問卻沒有得到解決:為什么要這樣寫。
我找了一款著名的JS開源庫JQuery,他的代碼就是典型的以上寫法,在粗略看了他的代碼之后我發(fā)現(xiàn)這套代碼實(shí)在太大了太復(fù)雜了,實(shí)在不適合我。于是我轉(zhuǎn)而去看另外一個(gè)開源js庫swfobject,這個(gè)庫提供了簡(jiǎn)單的接口把Flash控件嵌入到網(wǎng)頁中。這個(gè)代碼好多了,很短,很快就看完了。看完之后我恍然大悟,原來如此。真理就是如此簡(jiǎn)單,之所以這樣寫,只有一個(gè)目的:封裝。
初學(xué)JS的時(shí)候,我問過同事,js怎么定義私有函數(shù)和變量。當(dāng)時(shí)的得到的答案是:js不是面向?qū)ο蟮?,不提供這些功能。我對(duì)這個(gè)答案也坦然接受了,畢竟嚴(yán)格的封裝并不是必要的?,F(xiàn)在終于明白了,辦法總是有的,在不支持封裝的語言里同樣可以實(shí)現(xiàn)封裝。而實(shí)現(xiàn)的方法就是匿名函數(shù)。來看一段代碼:
//定義
function F(x)
{
this.x = x;
function double(x){return x*x;}
this.getDoubleX(){
return double(this.x);
}
}
//使用
f = new F(12);
alert(f.getDoubleX());
上面的代碼很簡(jiǎn)單,我沒有去運(yùn)行它。懂點(diǎn)js的都知道這是JS的類定義方式。函數(shù)F相當(dāng)于一個(gè)構(gòu)造函數(shù),而函數(shù)里面的其他定義都是函數(shù)私有的外部無法訪問,例如double函數(shù)。這樣就變相實(shí)現(xiàn)了私有方法。其他打上“this.”前綴的成員相當(dāng)于公開成員,外部可以訪問。
而這些庫之所以要用一個(gè)大函數(shù)包裹整個(gè)庫代碼,就是為了不向使用者暴露內(nèi)部方法和變量,強(qiáng)制用戶只能訪問開放的API。從這一點(diǎn)可以開出這些開發(fā)者的良苦用心。
到這里我不禁又要問了,js如何實(shí)現(xiàn)繼承呢。希望這一次的答案不要像上一次一樣:不支持。
復(fù)制代碼 代碼如下:
(function(){
//所有庫代碼代碼
})();
說實(shí)話,對(duì)于js初學(xué)者的我來說。這個(gè)東西太嚇人了,在這些JS庫中,這個(gè)函數(shù)基本上把整個(gè)庫的所有代碼全括起來了,這種寫法完全超越了我的常識(shí)。難道不應(yīng)該好好的劃分一下嗎,難道不應(yīng)該體現(xiàn)出層次和功能劃分嗎,怎么會(huì)一個(gè)函數(shù)搞定呢。我一開始完全不敢去細(xì)想它的道理。直到使用JS一段時(shí)間后,某一天一位同事在閑聊時(shí)說起了這個(gè)問題,我才知道這個(gè)叫匿名函數(shù)。匿名函數(shù)我并不陌生,C#,Python,Lua中都有這個(gè)咚咚。我到網(wǎng)上去查了一下,介紹文章很多,也很詳細(xì),但是我心頭的疑問卻沒有得到解決:為什么要這樣寫。
我找了一款著名的JS開源庫JQuery,他的代碼就是典型的以上寫法,在粗略看了他的代碼之后我發(fā)現(xiàn)這套代碼實(shí)在太大了太復(fù)雜了,實(shí)在不適合我。于是我轉(zhuǎn)而去看另外一個(gè)開源js庫swfobject,這個(gè)庫提供了簡(jiǎn)單的接口把Flash控件嵌入到網(wǎng)頁中。這個(gè)代碼好多了,很短,很快就看完了。看完之后我恍然大悟,原來如此。真理就是如此簡(jiǎn)單,之所以這樣寫,只有一個(gè)目的:封裝。
初學(xué)JS的時(shí)候,我問過同事,js怎么定義私有函數(shù)和變量。當(dāng)時(shí)的得到的答案是:js不是面向?qū)ο蟮?,不提供這些功能。我對(duì)這個(gè)答案也坦然接受了,畢竟嚴(yán)格的封裝并不是必要的?,F(xiàn)在終于明白了,辦法總是有的,在不支持封裝的語言里同樣可以實(shí)現(xiàn)封裝。而實(shí)現(xiàn)的方法就是匿名函數(shù)。來看一段代碼:
復(fù)制代碼 代碼如下:
//定義
function F(x)
{
this.x = x;
function double(x){return x*x;}
this.getDoubleX(){
return double(this.x);
}
}
//使用
f = new F(12);
alert(f.getDoubleX());
上面的代碼很簡(jiǎn)單,我沒有去運(yùn)行它。懂點(diǎn)js的都知道這是JS的類定義方式。函數(shù)F相當(dāng)于一個(gè)構(gòu)造函數(shù),而函數(shù)里面的其他定義都是函數(shù)私有的外部無法訪問,例如double函數(shù)。這樣就變相實(shí)現(xiàn)了私有方法。其他打上“this.”前綴的成員相當(dāng)于公開成員,外部可以訪問。
而這些庫之所以要用一個(gè)大函數(shù)包裹整個(gè)庫代碼,就是為了不向使用者暴露內(nèi)部方法和變量,強(qiáng)制用戶只能訪問開放的API。從這一點(diǎn)可以開出這些開發(fā)者的良苦用心。
到這里我不禁又要問了,js如何實(shí)現(xiàn)繼承呢。希望這一次的答案不要像上一次一樣:不支持。
您可能感興趣的文章:
- js中匿名函數(shù)的N種寫法
- javascript 匿名函數(shù)的理解(透徹版)
- js中匿名函數(shù)的創(chuàng)建與調(diào)用方法分析
- 詳談JavaScript 匿名函數(shù)及閉包
- js的匿名函數(shù)使用介紹
- Javascript的匿名函數(shù)講解
- JS自調(diào)用匿名函數(shù)具體實(shí)現(xiàn)
- Javascript中的回調(diào)函數(shù)和匿名函數(shù)的回調(diào)示例介紹
- Javascript自執(zhí)行匿名函數(shù)(function() { })()的原理淺析
- Javascript中匿名函數(shù)的多種調(diào)用方式總結(jié)
- JS匿名函數(shù)實(shí)例分析
相關(guān)文章
JavaScript實(shí)現(xiàn)反轉(zhuǎn)字符串的方法詳解
這篇文章主要介紹了JavaScript實(shí)現(xiàn)反轉(zhuǎn)字符串的方法,結(jié)合實(shí)例形式分析了字符串反轉(zhuǎn)操作,并詳細(xì)講述了相關(guān)函數(shù)的功能與使用注意事項(xiàng),需要的朋友可以參考下2017-04-04js實(shí)現(xiàn)拾色器插件(ColorPicker)
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)拾色器插件ColorPicker,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05JS實(shí)現(xiàn)給不同元素設(shè)置不同的定時(shí)器
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)給不同元素設(shè)置不同的定時(shí)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07使用TypeScript實(shí)現(xiàn)高效的異步隊(duì)列任務(wù)管理
在javaScript項(xiàng)目開發(fā)中,異步編程是不可或缺的一部分,從網(wǎng)絡(luò)請(qǐng)求到延時(shí)操作,異步操作使得我們能夠在等待某個(gè)任務(wù)完成時(shí)繼續(xù)執(zhí)行其他任務(wù),提高應(yīng)用的響應(yīng)性和性能,本文使用JavaScript實(shí)現(xiàn)一個(gè)異步隊(duì)列來優(yōu)雅地管理復(fù)雜的異步任務(wù)流,需要的朋友可以參考下2024-03-03用javascript實(shí)現(xiàn)讀取txt文檔的腳本
用javascript實(shí)現(xiàn)讀取txt文檔的腳本...2007-07-07