JavaScript自執(zhí)行函數(shù)和jQuery擴(kuò)展方法詳解
我們通常將JS代碼寫在一個(gè)單獨(dú)的JS文件中,然后在頁面中引入該文件。但是,有時(shí)候引入后會(huì)碰到變量名或函數(shù)名與其它JS代碼沖突的問題。那么如何解決這個(gè)問題呢?作用域隔離。在JS中,作用域是通過函數(shù)來劃分的,將JS代碼封裝到函數(shù)中進(jìn)行調(diào)用可以避免變量名/函數(shù)名沖突的問題,但是這也并不是萬無一失,因?yàn)榉庋b函數(shù)本身有可能和其它函數(shù)重名,解決方案:自執(zhí)行函數(shù)。
自執(zhí)行函數(shù)是用一對(duì)圓括號(hào)將匿名函數(shù)包起來,加括號(hào)(傳參)會(huì)立即執(zhí)行。因?yàn)楹瘮?shù)無名字,實(shí)現(xiàn)了作用域的絕對(duì)隔離和函數(shù)名的沖突問題?;拘问饺缦拢?/p>
(function () {
console.log('do something');
})();
比如我們在custome.js文件中寫了一些JS邏輯,并封裝到函數(shù)init中。我們用自執(zhí)行函數(shù)將自己定義的函數(shù)init包起來,就像下面這樣。
(function () {
function init() {
console.log('execute init...');
}
init();
})();
當(dāng)我們在html中引入custome.js:<script src="custome.js"></script>,自執(zhí)行函數(shù)會(huì)立即執(zhí)行,進(jìn)而執(zhí)行內(nèi)部定義的init函數(shù):
不過,自執(zhí)行函數(shù)立即執(zhí)行的特性,使其很難調(diào)用。通過定義jQuery擴(kuò)展方法,可以解決這一問題,拿到自執(zhí)行函數(shù)調(diào)用和執(zhí)行的主動(dòng)權(quán)。
首先我們看一下定義jQuery擴(kuò)展方法的基本形式:
jQuery.extend({
'myMethod': function () {
console.log('do something');
}
});
這樣,通過$.myMethod()或jQuery.myMethod()就可以調(diào)用上面定義的方法。
定義jQuery擴(kuò)展方法還有另外一種方式:.fn
jQuery.fn.extend({
'myMethod': function () {
console.log('do something');;
}
});
通過如上方式定義的擴(kuò)展方法,需要通過jQuery選擇器調(diào)用,比如通過標(biāo)簽選擇器$("button").myMethod(args)
了解了JS自執(zhí)行函數(shù)和jQuery擴(kuò)展方法后,我們將二者結(jié)合起來。
下面我們利用自執(zhí)行函數(shù)立即執(zhí)行的特點(diǎn),來定義jQuery擴(kuò)展方法:
(function (jq) {
function init() {
console.log('do something');
}
jq.extend({
'myMethod': function () {
init();
}
})
})(jQuery);
說明,這個(gè)自執(zhí)行函數(shù)接收jQuery對(duì)象作為參數(shù),然后在內(nèi)部為jQuery定義一個(gè)擴(kuò)展方法myMethod,該方法執(zhí)行真正的邏輯代碼init函數(shù)
調(diào)用:
<script src="jquery-3.2.1.js"></script>
<script src="custome.js"></script>
<script>
$(function () {
$.myMethod();
});
</script>
說明:
jQuery文件引入后,jQuery對(duì)象全局可用;
緊接著引入自定義JS文件custome.js,其中的自執(zhí)行函數(shù)接收jQuery對(duì)象為參數(shù),立即執(zhí)行,在內(nèi)部為jQuery定義一個(gè)擴(kuò)展方法myMethod
然后我們就可以在頁面加載完成后,通過調(diào)用$.meMethod()或jQuery.myMethod()來執(zhí)行init函數(shù)
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js列舉css中所有圖標(biāo)的實(shí)現(xiàn)代碼
最近在做一個(gè)通用的配置模塊。配置模塊中必然要對(duì)系統(tǒng)的菜單、功能模塊、權(quán)限資源等進(jìn)行配置,為了更好的用戶體驗(yàn),圖標(biāo)是必不可少的!2011-07-07
js圖片延遲加載(Lazyload)三種實(shí)現(xiàn)方式
這篇文章主要介紹了js延遲加載(Lazyload)三種實(shí)現(xiàn)方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
使用 Node.js 做 Function Test實(shí)現(xiàn)方法
這篇文章介紹了Node.js 做 Function Test實(shí)現(xiàn)方法,有需要的朋友可以參考一下2013-10-10
javascript對(duì)象的相關(guān)操作小結(jié)
下面小編就為大家?guī)硪黄猨avascript對(duì)象的相關(guān)操作小結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05
分享JS代碼實(shí)現(xiàn)鼠標(biāo)放在輸入框上輸入框和圖片同時(shí)更換樣式
在一些網(wǎng)站我們會(huì)見到,當(dāng)鼠標(biāo)放在輸入框上輸入框和圖片同時(shí)更換樣式,那么基于js代碼是如何實(shí)現(xiàn)的呢?下面小編給大家解答下2016-09-09
微信小程序動(dòng)態(tài)設(shè)置圖片大小的方法
這篇文章主要介紹了微信小程序動(dòng)態(tài)設(shè)置圖片大小的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
利用BootStrap的Carousel.js實(shí)現(xiàn)輪播圖動(dòng)畫效果
這篇文章主要介紹了利用BootStrap的Carousel.js實(shí)現(xiàn)輪播圖動(dòng)畫效果的相關(guān)資料,需要的朋友可以參考下2016-12-12

