Saya mahu menulis pustaka JavaScript yang cekap tetapi tidak tahu bagaimana untuk memulakan
Saya cuba membaca perpustakaan kelas orang lain, tetapi saya tidak faham sama sekali
Saya bercadang untuk mengkaji fungsi lanjutan js, tetapi kandungan dalam buku berwibawa terlalu berselerak,
Walaupun saya masih ingat "penggunaan", saya tidak memikirkan "kaedah" apabila "menggunakan"nya.
Mungkin anda seperti saya, nampaknya ada satu kuasa ghaib yang menghalang rancangan kita, membuatkan kita berulang kali memikirkan keterbatasan ilmu, menyebabkan kita terdiam dan sukar untuk maju ke hadapan.
Dalam tempoh ini, tekanan meningkat dua kali ganda disebabkan oleh pelbagai tugasan, reka bentuk kursus dan laporan percubaan. Jarang untuk memerah sedikit masa, tidak pernah tidur, menyusun dan meringkaskan buku yang saya baca pada masa lalu, hanya untuk lebih dekat dengan menulis perpustakaan kelas saya sendiri.
Artikel ini merujuk kepada "Javascript Language Essence" dan "Effective JavaScript". Contoh telah dinyahpepijat, dan selepas memahaminya, saya ingin membuat beberapa prinsip "mendalam" sedikit lebih mudah.
1. Skop pembolehubah
Skop adalah seperti oksigen kepada pengaturcara. Ia ada di mana-mana, dan anda sering tidak memikirkannya. Tetapi apabila ia tercemar (cth. menggunakan objek global), anda boleh berasa sesak nafas (cth. aplikasi menjadi kurang responsif). Peraturan skop teras JavaScript adalah mudah, direka bentuk dengan baik dan berkuasa. Menggunakan JavaScript dengan berkesan memerlukan penguasaan beberapa konsep asas skop pembolehubah dan memahami beberapa kes kelebihan yang boleh membawa kepada masalah sukar difahami dan buruk.
1.1 Gunakan pembolehubah global sesedikit mungkin
Javascript memudahkan untuk mencipta pembolehubah dalam ruang nama global. Mencipta pembolehubah global adalah mudah kerana ia tidak memerlukan sebarang bentuk pengisytiharan dan diakses secara automatik oleh semua kod sepanjang program.
Bagi pemula seperti kami, apabila kami menghadapi keperluan tertentu (contohnya, data yang dihantar direkodkan, digunakan semasa menunggu fungsi tertentu dipanggil pada masa tertentu; atau fungsi tertentu sering digunakan), kami tidak teragak-agak untuk memikirkan fungsi global, atau bahkan Bahasa C yang saya pelajari pada tahun pertama saya terlalu berakar umbi dalam pemikiran berorientasikan proses, dan sistem ini penuh dengan fungsi. Mentakrifkan pembolehubah global mencemarkan ruang nama awam yang dikongsi dan boleh membawa kepada konflik penamaan yang tidak dijangka. Pembolehubah global juga memudaratkan modulariti kerana ia membawa kepada gandingan yang tidak perlu antara komponen bebas dalam program. Secara serius, terlalu banyak global (termasuk helaian gaya, mentakrifkan secara langsung gaya div atau a) akan menjadi ralat bencana apabila disepadukan ke dalam proses pembangunan berbilang orang. Itulah sebabnya semua kod jQuery dibalut dengan ungkapan tanpa nama yang dilaksanakan serta-merta - fungsi tanpa nama panggilan sendiri. Apabila penyemak imbas memuatkan fail jQuery, fungsi tanpa nama panggilan sendiri serta-merta mula melaksanakan dan memulakan setiap modul jQuery untuk mengelak daripada merosakkan dan mencemarkan pembolehubah global serta menjejaskan kod lain.
Selain itu, anda mungkin berfikir bahawa lebih mudah untuk "menulis bagaimana anda mahu dahulu dan menyusunnya kemudian", tetapi pengaturcara yang baik akan sentiasa memberi perhatian kepada struktur program, terus mengklasifikasikan fungsi yang berkaitan dan memisahkan komponen yang tidak berkaitan . dan masukkan tingkah laku ini sebagai sebahagian daripada proses pengaturcaraan.
Memandangkan ruang nama global ialah satu-satunya cara untuk komponen bebas dalam program JavaScript berinteraksi, penggunaan kawalan yang dinamakan secara global tidak dapat dielakkan. Komponen atau perpustakaan perlu menentukan beberapa pembolehubah global. untuk digunakan oleh bahagian lain program. Jika tidak, lebih baik menggunakan pembolehubah tempatan.
Ruang nama global JavaScript juga terdedah kepada objek global yang boleh diakses dalam skop global program, yang berfungsi sebagai nilai awal kata kunci ini. Dalam pelayar web, objek global terikat pada pembolehubah tetingkap global. Ini bermakna anda mempunyai dua cara untuk mencipta pembolehubah global: mengisytiharkannya menggunakan var dalam skop global, atau menambahnya pada objek global. Kelebihan menggunakan perisytiharan var ialah ia dapat menyatakan dengan jelas kesan pembolehubah global dalam skop program.
Memandangkan rujukan kepada pembolehubah global terikat boleh menyebabkan ralat masa jalan, memastikan skop yang jelas dan ringkas akan memudahkan pengguna kod anda memahami pembolehubah global yang diisytiharkan oleh program.
Memandangkan objek global menyediakan mekanisme tindak balas dinamik untuk persekitaran global, anda boleh menggunakannya untuk menanyakan persekitaran yang sedang berjalan dan mengesan ciri yang tersedia pada platform ini.
cth.ES5 memperkenalkan objek JSON global untuk membaca dan menulis data dalam format JSON.
Reka bentuk asal kursus struktur data mensimulasikan operasi asas rentetan, yang memerlukan kaedah yang disediakan oleh bahasa itu sendiri tidak boleh digunakan. JavaScript melaksanakan operasi asas pada tatasusunan dengan sangat baik Jika ia hanya untuk keperluan pembelajaran umum, idea untuk mensimulasikan kaedah yang disediakan oleh bahasa itu sendiri adalah baik, tetapi jika anda benar-benar melabur dalam pembangunan, tidak perlu. pertimbangkan untuk menggunakan kaedah terbina dalam JavaScript di tempat pertama.
1.2 Elakkan menggunakan dengan
Pernyataan dengan memberikan sebarang "kemudahan" yang menjadikan aplikasi anda tidak boleh dipercayai dan tidak cekap. Kita perlu memanggil satu siri kaedah pada satu objek dalam urutan. Menggunakan pernyataan dengan boleh mengelakkan rujukan berulang pada objek dengan mudah:
Sebaliknya dengan bahasa, cara mudah ialah mengikat objek kepada nama pembolehubah pendek.
Dalam kes lain, pendekatan terbaik ialah mengikat pembolehubah setempat secara eksplisit pada harta yang berkaitan.
1.3 Mahir dalam penutupan
Terdapat satu konsep untuk memahami penutupan:
a) JavaScript membenarkan anda merujuk pembolehubah yang ditakrifkan di luar fungsi semasa.
b) Walaupun fungsi luaran telah kembali, fungsi semasa masih boleh merujuk pembolehubah yang ditakrifkan dalam fungsi luaran
Fungsi boleh merujuk mana-mana pembolehubah dalam skopnya, termasuk parameter dan pembolehubah fungsi luaran. Kita boleh memanfaatkan ini untuk menulis fungsi pembuat sandwic yang lebih umum.
Penutupan ialah salah satu ciri JavaScript yang paling elegan dan ekspresif dan merupakan nadi kepada banyak simpulan bahasa.
c) Penutupan boleh mengemas kini nilai pembolehubah luaran. Malah, penutupan menyimpan rujukan kepada pembolehubah luaran, bukan salinan nilainya. Oleh itu, kemas kini boleh dibuat untuk sebarang penutupan yang mempunyai akses kepada pembolehubah luaran ini.
Contoh ini menghasilkan objek yang mengandungi tiga penutupan. Tiga penutupan ini ditetapkan, taip dan dapatkan sifat Mereka semua berkongsi akses kepada pembolehubah val. Penutupan set mengemas kini nilai val. Kemudian panggil dapatkan dan taip untuk melihat hasil yang dikemas kini.
1.4 Memahami penambahbaikan pengisytiharan berubah
Javascript menyokong kaedah skop ini (rujukan kepada pembolehubah foo akan terikat pada skop yang paling hampir dengan pengisytiharan pembolehubah foo), tetapi tidak menyokong skop peringkat blok (skop definisi pembolehubah bukanlah skop lampiran terdekat) pernyataan atau blok kod).
Tidak memahami ciri ini akan membawa kepada beberapa pepijat halus:
Salin kod
Salin kod
Program ini kelihatan seperti akan menjana null, tetapi ia sebenarnya akan menjana objek baharu.
Oleh kerana skop pembolehubah fungsi yang dinamakan mewarisi Object.prototype.constructor (iaitu, pembina Object), sama seperti pernyataan with, skop ini akan dipengaruhi oleh perubahan dinamik Object.prototype. Cara untuk mengelakkan objek mencemarkan skop ungkapan fungsi dalam sistem anda adalah untuk mengelak daripada menambah sifat pada Object.prototype pada bila-bila masa dan untuk mengelak daripada menggunakan sebarang pembolehubah tempatan dengan nama yang sama dengan sifat Object.prototype standard.
Satu lagi kelemahan dalam enjin JavaScript yang popular ialah promosi pengisytiharan ungkapan fungsi yang dinamakan.
Sesetengah persekitaran JavaScript malah menganggap kedua-dua fungsi f dan g sebagai objek berbeza, mengakibatkan peruntukan memori yang tidak diperlukan.
1.6 Berhati-hati dengan pengisytiharan skop yang janggal untuk fungsi blok tempatan