1. Ikhtisar fungsi anonim
Pertama kali saya mengetahui tentang fungsi anonim ada di kode sumber jquery. Hal pertama yang saya lihat ketika saya membuka jQuery adalah
Copy kode kodenya sebagai berikut:
(fungsi( jendela, tidak terdefinisi ) {................................})(jendela);
Ini adalah fungsi anonim, dengan parameter berwarna merah. Fungsi dari fungsi anonim adalah untuk membuat area tertutup, dan variabel serta metode di dalamnya tidak dapat diakses oleh pihak luar.
Karena tidak bisa diakses, bagaimana cara memanggil jquery? Ini karena fungsi anonim jquery memiliki dua kalimat berikut (teks biru):
Copy kode kodenya sebagai berikut:
(fungsi( jendela, tidak terdefinisi ) {
// Tentukan salinan lokal jQuery
var jQuery = function(pemilih, konteks) {
// Objek jQuery sebenarnya hanyalah konstruktor init yang 'ditingkatkan'
kembalikan jQuery.fn.init baru (pemilih, konteks);
},
.........
window.jQuery = jendela.$ = jQuery;
})(jendela);
Ternyata jQuery diteruskan ke window dalam fungsi anonim, itulah sebabnya window diteruskan saat meneruskan parameter, jadi setiap kali jquery dipanggil di masa mendatang, objek jQuery dari window sebenarnya dipanggil.
jquery memanggil metodenya sendiri. Itu tidak bisa dipanggil dari luar, yang menjamin keamanan dan tidak ada konflik.
2. Melanjutkan topik diatas, tentang plugin jQuery
Berikut ini adalah bagian kode untuk kontrol paging yang saya tulis:
Copy kode kodenya sebagai berikut:
;(fungsi ($) {
$.fn.tabing = fungsi (arg) {
contoh = Plugin baru(ini, arg);
};
var contoh = nol;
fungsi Plugin(elemen){
this._tabs = $(elemen);
this._tabli = $("a[href*='#']",ini._tabs);
this._tabDiv = this._tabs.siblings().filter("div[id*='tab']");
ini.init();
}
Plugin.prototipe = {
init: fungsi(){
this._tabli.addClass("tidak dipilih");
this._tabli.eq(0).addClass("dipilih");
this._tabDiv.css("tampilan","tidak ada");
this._tabDiv.eq(0).css("tampilan","blok");
this._tabli.each(fungsi(){
$(ini).bind("klik",fungsi(){
for(var i = 0;i<instance._tabDiv.length;i++){
instance._tabDiv.eq(i).css("display","tidak ada");
}
instance._tabDiv.filter("#"+$(ini).attr("href").split('#')[1]).css("display","block");
});
})
}
}
})(jQuery);
Perhatikan kata-kata berwarna merah. Faktanya, plugin jQuery juga menulis fungsi anonim, yang menjamin independensi setiap plugin. Jika tidak, itu tidak disebut plugin. Kata-kata merah $.fn.tabing menunjukkan hal itu ada tabing di plug-in ini untuk fn jquery,
Dengan cara ini, objek jquery eksternal dapat langsung memanggil tabing, yang juga merupakan satu-satunya kontak antara plug-in dan dunia luar.
3. Setelah membahas tentang penggunaan fungsi anonim oleh plugin jquery, mari kita bahas tentang fungsi anonim dari window
Faktanya, jquery sendiri adalah fungsi anonim dari window, yang merupakan poin pertama. Jadi bagaimana kita menulis fungsi anonim dari window?
Artinya, setelah menulis fungsi anonim, terdapat antarmuka untuk berinteraksi dengan jendela di fungsi tersebut, seperti berikut:
Copy kode kodenya sebagai berikut:
(fungsi(){
fungsi getObjByID(id){
kembalikan dokumen.getElementById(id);
}
fungsi __tambahKelas(id,Namakelas,Nilaikelas){
$(id).style.className=nilaikelas;
}
window.addClass=__addClass;
})();
Lihat juga kata-kata berwarna merah, sehingga Anda dapat memanggil addClass() di luar fungsi anonim, tetapi Anda tidak dapat memanggil getObjByID().
4. Fungsi anonim juga akan dijalankan selama parsing
sebagai berikut:
Copy kode kodenya sebagai berikut:
fungsi Video() { };
fungsi Film() { };
var _video = Video baru();
_video.ukuran = 3;
_video.toString = fungsi () {
kembalikan "video";
};
_video.getName = fungsi () {
kembalikan "VideoXXX";
};
var _film = Film baru();
(fungsi (orang tua, anak) {
for (var ele di induk) {
if (!child[ele]) //Salinan induk hanya akan disalin bila anak tidak berisi atribut atau metode.
anak[ele] = orang tua[ele];
}
})(_video, _movie); //Cara memanggil fungsi anonim
alert(_film.ukuran); //3
alert(_movie.toString()); //[Objek Objek]
alert(_movie.getName()); //VideoXXX
Ketiga peringatan tersebut membuahkan hasil, yang menunjukkan bahwa fungsi anonim dijalankan secara internal.