


Memikirkan semula JavaScript. Aplikasi Separa, Ketelusan Rujukan dan Operasi Malas
Hai semua! Beberapa ketika dahulu, semasa menyemak imbas cadangan TC39 terbaharu, saya terjumpa satu yang membuatkan saya teruja — dan agak ragu-ragu. Ini mengenai sintaks aplikasi separa untuk JavaScript. Pada pandangan pertama, ia kelihatan seperti penyelesaian yang sempurna untuk banyak sakit kepala pengekodan biasa, tetapi apabila saya memikirkannya, saya menyedari terdapat banyak perkara untuk disukai dan sedikit ruang untuk penambahbaikan.
Lebih baik lagi, kebimbangan ini mencetuskan idea baharu yang boleh menjadikan JavaScript lebih berkuasa. Izinkan saya membawa anda dalam perjalanan ini, lengkap dengan contoh realistik tentang cara ciri ini boleh mengubah cara kami mengekod setiap hari.
TLDR: artikel datang dari isu lama saya kepada cadangan: https://github.com/tc39/proposal-partial-application/issues/53
Cadangan
Aplikasi separa membolehkan anda "pratetap" beberapa argumen fungsi, mengembalikan fungsi baharu untuk kegunaan kemudian. Kod semasa kami kelihatan seperti ini:
const fetchWithAuth = (path: string) => fetch( { headers: { Authorization: "Bearer token" } }, path, ); fetchWithAuth("/users"); fetchWithAuth("/posts");
Cadangan memperkenalkan sintaks ~() untuk ini:
const fetchWithAuth = fetch~({ headers: { Authorization: "Bearer token" } }, ?); fetchWithAuth("/users"); fetchWithAuth("/posts");
Lihat apa yang berlaku? Fungsi fetchWithAuth praisi argumen pengepala, jadi anda hanya perlu membekalkan URL. Ia seperti .bind() tetapi lebih fleksibel dan lebih mudah dibaca.
Cadangan itu juga membolehkan anda menggunakan ? sebagai pemegang tempat untuk hujah yang tidak diisi dan ... untuk parameter rehat. Contohnya:
const sendEmail = send~(user.email, ?, ...); sendEmail("Welcome!", "Hello and thanks for signing up!"); sendEmail("Reminder", "Don't forget to confirm your email.");
Bahagian kegemaran saya ialah saya tidak perlu menduplikasi anotasi jenis!
Nampak berguna, kan? Tetapi ada banyak lagi untuk dibongkar.
Kes untuk Ketelusan Rujukan
Mari kita mulakan dengan titik kesakitan yang praktikal: penutupan fungsi dan rujukan pembolehubah lapuk.
Katakan anda menjadualkan beberapa pemberitahuan. Anda mungkin menulis sesuatu seperti ini:
function notify(state: { data?: Data }) { if (state.data) { setTimeout(() => alert(state.data), 1000) } }
Adakah anda sudah melihat masalahnya? Sifat "data" mungkin berubah semasa tamat masa dan amaran tidak akan menunjukkan apa-apa! Membetulkan perkara ini memerlukan secara eksplisit menghantar rujukan nilai, semoga "setTimeout" menerima argumen tambahan untuk menghantarnya ke dalam panggilan balik:
function notify(state: { data?: Data }) { if (state.data) { setTimeout((data) => alert(data), 1000, state.data) } }
Tidak teruk, tetapi ia tidak disokong secara meluas merentas API. Aplikasi separa boleh menjadikan corak ini lebih universal:
function notify(state: { data?: Data }) { if (state.data) { setTimeout(alert~(state.data), 1000) } }
Dengan mengunci state.data pada masa penciptaan fungsi, kami mengelakkan pepijat yang tidak dijangka disebabkan rujukan lapuk.
Mengurangkan Pengiraan Berulang
Satu lagi faedah praktikal aplikasi separa ialah menghapuskan kerja berlebihan apabila memproses set data yang besar.
Sebagai contoh, anda mempunyai logik pemetaan, yang perlu mengira data tambahan untuk setiap langkah lelaran:
const fetchWithAuth = (path: string) => fetch( { headers: { Authorization: "Bearer token" } }, path, ); fetchWithAuth("/users"); fetchWithAuth("/posts");
Masalahnya ialah dalam akses proksi kepada this.some.lain, ia agak berat untuk memanggil setiap langkah lelaran. Adalah lebih baik untuk memfaktorkan semula kod ini seperti:
const fetchWithAuth = fetch~({ headers: { Authorization: "Bearer token" } }, ?); fetchWithAuth("/users"); fetchWithAuth("/posts");
Dengan aplikasi separa, kami boleh melakukannya dengan kurang bertele-tele:
const sendEmail = send~(user.email, ?, ...); sendEmail("Welcome!", "Hello and thanks for signing up!"); sendEmail("Reminder", "Don't forget to confirm your email.");
Dengan membakar dalam pengiraan kongsi, anda menjadikan kod lebih ringkas dan lebih mudah untuk diikuti, tanpa mengorbankan prestasi.
Mengapa Tambah Sintaks Baharu?
Sekarang, di sinilah saya mula menggaru kepala. Walaupun sintaks yang dicadangkan adalah elegan, JavaScript sudah mempunyai banyak pengendali. Terutamanya pengendali tanda soal?. Menambah ~() mungkin menjadikan bahasa lebih sukar untuk dipelajari dan dihuraikan.
Bagaimana jika kita boleh mencapai fungsi yang sama tanpa memperkenalkan sintaks baharu?
Alternatif Berasaskan Kaedah
Bayangkan memanjangkan Function.prototype dengan kaedah seri:
function notify(state: { data?: Data }) { if (state.data) { setTimeout(() => alert(state.data), 1000) } }
Ia lebih bertele-tele tetapi mengelak daripada memperkenalkan pengendali baharu sepenuhnya. Menggunakan simbol khas tambahan untuk ruang letak kita boleh menggantikan tanda soal.
function notify(state: { data?: Data }) { if (state.data) { setTimeout((data) => alert(data), 1000, state.data) } }
Ia mengumpul dengan sempurna tanpa kerumitan masa terbina tambahan!
function notify(state: { data?: Data }) { if (state.data) { setTimeout(alert~(state.data), 1000) } }
Tetapi ini hanyalah puncak gunung ais. ia menjadikan konsep pemegang tempat boleh diguna semula merentas API yang berbeza.
Operasi Malas: Ambil Lagi
Di sinilah perkara menjadi sangat menarik. Bagaimana jika kita mengembangkan konsep simbol untuk membolehkan operasi malas?
Contoh 1: Menggabungkan .filter() dan .map()
Andaikan anda sedang memproses senarai produk untuk tapak e-dagang. Anda mahu menunjukkan item diskaun sahaja, dengan harganya dibundarkan. Biasanya, anda akan menulis ini:
class Store { data: { list: [], some: { another: 42 } } get computedList() { return this.list.map((el) => computeElement(el, this.some.another)) } contructor() { makeAutoObservable(this) } }
Tetapi ini memerlukan lelaran ke atas tatasusunan dua kali. Dengan operasi malas, kami boleh menggabungkan kedua-dua langkah menjadi satu laluan:
class Store { data: { list: [], some: { another: 42 } } get computedList() { const { another } = this.some return this.list.map((el) => computeElement(el, another)) } contructor() { makeAutoObservable(this) } }
Symbol.skip memberitahu enjin untuk mengecualikan item daripada tatasusunan akhir, menjadikan operasi itu cekap dan ekspresif!
Contoh 2: Penamatan Awal dalam .reduce()
Bayangkan mengira jumlah hasil daripada lima jualan pertama. Biasanya, anda akan menggunakan bahagian dalam bersyarat .reduce():
class Store { data: { list: [], some: { another: 42 } } get computedList() { return this.list.map(computeElement~(?, this.some.another)) } contructor() { makeAutoObservable(this) } }
Ini berfungsi, tetapi ia masih memproses setiap item dalam tatasusunan. Dengan pengurangan yang malas, kami boleh memberi isyarat penamatan awal:
function notify(state: { data?: Data }) { if (state.data) { setTimeout(alert.tie(state.data), 1000) } }
Kehadiran Symbol.skip boleh memberitahu enjin untuk berhenti lelaran sebaik sahaja keadaan dipenuhi, menjimatkan kitaran berharga.
Mengapa Ini Penting
Idea ini — aplikasi separa, ketelusan rujukan dan operasi malas — bukan sekadar konsep akademik. Mereka menyelesaikan masalah dunia sebenar:
- Penggunaan API yang lebih bersih: Kunci hujah di hadapan dan elakkan rujukan lapuk.
- Prestasi yang dipertingkatkan: Hapuskan pengiraan berlebihan dan dayakan lelaran yang lebih cekap.
- Ekspresif yang lebih baik: Tulis kod deklaratif yang ringkas dan lebih mudah dibaca dan diselenggara.
Sama ada kita kekal dengan ~() atau meneroka alternatif seperti tie dan Symbol.skip, prinsip asas mempunyai potensi besar untuk meningkatkan cara kita menulis JavaScript.
Saya mengundi pendekatan simbol kerana ia mudah diisi poli dan mempunyai pelbagai kegunaan.
Apa Seterusnya?
Saya ingin tahu—apa pendapat anda? Adakah ~() arah yang betul, atau patutkah kita meneroka pendekatan berasaskan kaedah? Dan bagaimanakah operasi malas akan memberi kesan kepada aliran kerja anda? Mari berbincang dalam komen!
Keindahan JavaScript terletak pada evolusi yang dipacu komunitinya. Dengan berkongsi dan membahaskan idea, kita boleh membentuk bahasa yang berfungsi lebih baik untuk semua orang. Mari teruskan perbualan!
Atas ialah kandungan terperinci Memikirkan semula JavaScript. Aplikasi Separa, Ketelusan Rujukan dan Operasi Malas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Jenis data teras JavaScript adalah konsisten dalam penyemak imbas dan node.js, tetapi ditangani secara berbeza dari jenis tambahan. 1) Objek global adalah tetingkap dalam penyemak imbas dan global di Node.js. 2) Objek penampan unik Node.js, digunakan untuk memproses data binari. 3) Terdapat juga perbezaan prestasi dan pemprosesan masa, dan kod perlu diselaraskan mengikut persekitaran.

JavaScriptusestWotypesofcomments: Single-line (//) danMulti-line (//)

Perbezaan utama antara Python dan JavaScript ialah sistem jenis dan senario aplikasi. 1. Python menggunakan jenis dinamik, sesuai untuk pengkomputeran saintifik dan analisis data. 2. JavaScript mengamalkan jenis yang lemah dan digunakan secara meluas dalam pembangunan depan dan stack penuh. Kedua -duanya mempunyai kelebihan mereka sendiri dalam pengaturcaraan dan pengoptimuman prestasi yang tidak segerak, dan harus diputuskan mengikut keperluan projek ketika memilih.

Sama ada untuk memilih Python atau JavaScript bergantung kepada jenis projek: 1) Pilih Python untuk Sains Data dan Tugas Automasi; 2) Pilih JavaScript untuk pembangunan front-end dan penuh. Python disukai untuk perpustakaannya yang kuat dalam pemprosesan data dan automasi, sementara JavaScript sangat diperlukan untuk kelebihannya dalam interaksi web dan pembangunan stack penuh.

Python dan JavaScript masing -masing mempunyai kelebihan mereka sendiri, dan pilihan bergantung kepada keperluan projek dan keutamaan peribadi. 1. Python mudah dipelajari, dengan sintaks ringkas, sesuai untuk sains data dan pembangunan back-end, tetapi mempunyai kelajuan pelaksanaan yang perlahan. 2. JavaScript berada di mana-mana dalam pembangunan front-end dan mempunyai keupayaan pengaturcaraan tak segerak yang kuat. Node.js menjadikannya sesuai untuk pembangunan penuh, tetapi sintaks mungkin rumit dan rawan kesilapan.

Javascriptisnotbuiltoncorc; it'saninterpretedlanguagethatrunsonenginesoftenwritteninc .1) javascriptwasdesignedasalightweight, interpratedlanguageforwebbrowsers.2)

JavaScript boleh digunakan untuk pembangunan front-end dan back-end. Bahagian depan meningkatkan pengalaman pengguna melalui operasi DOM, dan back-end mengendalikan tugas pelayan melalui Node.js. 1. Contoh front-end: Tukar kandungan teks laman web. 2. Contoh backend: Buat pelayan Node.js.

Memilih Python atau JavaScript harus berdasarkan perkembangan kerjaya, keluk pembelajaran dan ekosistem: 1) Pembangunan Kerjaya: Python sesuai untuk sains data dan pembangunan back-end, sementara JavaScript sesuai untuk pembangunan depan dan penuh. 2) Kurva Pembelajaran: Sintaks Python adalah ringkas dan sesuai untuk pemula; Sintaks JavaScript adalah fleksibel. 3) Ekosistem: Python mempunyai perpustakaan pengkomputeran saintifik yang kaya, dan JavaScript mempunyai rangka kerja front-end yang kuat.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

SublimeText3 versi Inggeris
Disyorkan: Versi Win, menyokong gesaan kod!

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma
