Pernahkah Anda melihat di bawah kap di kode sumber jQuery 1.4 dan perhatikan bagaimana itu dienkapsulasi dengan cara berikut:
(function( window, undefined ) {
//All the JQuery code here
...
})(window);
Saya telah membaca sebuah artikel tentang JavaScript Namespacing dan satu lagi yang disebut " Sepasang Penting Orangtua ", jadi saya tahu beberapa tentang apa yang terjadi di sini.
Tapi saya belum pernah melihat sintaks khusus ini sebelumnya. Apa yang undefined
dilakukan di sana? Dan mengapa window
harus dilewati dan kemudian muncul di akhir lagi?
javascript
jquery
syntax
dkinzer
sumber
sumber
Jawaban:
Undefined adalah variabel normal dan dapat diubah dengan
undefined = "new value";
. Jadi jQuery membuat variabel "tidak terdefinisi" lokal yang BENAR-BENAR tidak terdefinisi.Variabel jendela dibuat lokal untuk alasan kinerja. Karena ketika JavaScript mencari variabel, pertama-tama ia akan melalui variabel lokal hingga ia menemukan nama variabel. Ketika tidak ditemukan, JavaScript melewati ruang lingkup berikutnya dll. Hingga filter melalui variabel global. Jadi, jika variabel jendela dibuat lokal, JavaScript dapat melihatnya lebih cepat. Informasi lebih lanjut: Percepat JavaScript Anda - Nicholas C. Zakas
sumber
Tidak terdefinisi
Dengan mendeklarasikan
undefined
sebagai argumen tetapi tidak pernah memberikan nilai padanya memastikan bahwa itu selalu tidak terdefinisi, karena itu hanya variabel dalam lingkup global yang dapat ditimpa. Ini membuata === undefined
alternatif yang amantypeof a == 'undefined'
, yang menghemat beberapa karakter. Ini juga membuat kode lebih ramah-minifier, sepertiundefined
dapat disingkat menjadiu
, misalnya, menyimpan beberapa karakter lagi.Jendela
Lulus
window
sebagai argumen menyimpan salinan di lingkup lokal, yang memengaruhi kinerja: http://jsperf.com/short-scope . Semua akses kewindow
sekarang harus melakukan perjalanan satu tingkat kurang dari rantai ruang lingkup. Seperti halnyaundefined
, salinan lokal lagi memungkinkan untuk minifikasi yang lebih agresif.Sidenote:
Meskipun ini mungkin bukan maksud dari pengembang jQuery, lewat
window
memungkinkan perpustakaan menjadi lebih mudah diintegrasikan dalam lingkungan Javascript sisi-server, misalnya node.js - di mana tidak adawindow
objek global . Dalam situasi seperti itu, hanya satu baris yang perlu diubah untuk menggantiwindow
objek dengan yang lain. Dalam kasus jQuery,window
objek tiruan dapat dibuat dan diteruskan untuk tujuan pengikisan HTML (perpustakaan seperti jsdom dapat melakukan ini).sumber
(function(a,b){})(window);
-a
danb
jauh lebih pendek daripadawindow
danundefined
:)Yang lain sudah menjelaskan
undefined
.undefined
seperti variabel global yang dapat didefinisikan ulang untuk nilai apa pun. Teknik ini untuk mencegah semua cek yang tidak ditentukan dari melanggar jika seseorang menulis katakan, diundefined = 10
suatu tempat. Argumen yang tidak pernah disahkan dijamin nyataundefined
terlepas dari nilai variabelundefined
.Alasan untuk lewat jendela dapat diilustrasikan dengan contoh berikut.
Apa yang dicatat oleh konsol konsol? Nilai
window
objeknya benar? Salah! 10? Salah! Ini logundefined
. Penerjemah Javascript (atau kompiler JIT) menulis ulang dengan cara ini -Namun, jika Anda mendapatkan
window
variabel sebagai argumen, tidak ada var dan karenanya tidak ada kejutan.Saya tidak tahu apakah jQuery melakukannya, tetapi jika Anda mendefinisikan ulang
window
variabel lokal di mana saja dalam fungsi Anda untuk alasan apa pun, itu ide yang baik untuk meminjamnya dari lingkup global.sumber
window
dilewatkan seperti itu kalau-kalau seseorang memutuskan untuk mendefinisikan kembali objek jendela di IE, saya berasumsi sama untukundefined
, dalam kasus itu ditugaskan kembali dalam beberapa cara nanti.Bagian atas
window
dalam skrip itu hanya menamai argumen "jendela", argumen yang lebih lokal bahwawindow
referensi global dan apa kode di dalam penutupan ini akan digunakan. Yangwindow
pada akhirnya sebenarnya menentukan apa yang harus dilewati untuk argumen pertama, dalam hal ini arti saat iniwindow
... harapannya adalah Anda belum mengacaukanwindow
sebelum itu terjadi.Ini mungkin lebih mudah untuk memikirkan dengan menunjukkan kasus yang khas yang paling digunakan dalam jQuery, Plugin
.noConflict()
penanganan, sehingga untuk sebagian besar kode Anda masih bisa menggunakan$
, bahkan jika itu berarti sesuatu yang lain darijQuery
luar lingkup ini:sumber
Diuji dengan iterasi 1000000. Pelokalan semacam ini tidak mempengaruhi kinerja. Bahkan satu milidetik dalam iterasi 1000000. Ini sama sekali tidak berguna.
sumber
window
Anda mungkin melihat beberapa keuntungan dengan salinan lokal.