Pengenalan
Dalam banyak bahasa tradisional (C/C/Java/C#, dll.), fungsi wujud sebagai warga kelas kedua Anda hanya boleh mengisytiharkan fungsi menggunakan kata kunci bahasa dan kemudian memanggilnya fungsi sebagai parameter Menyalurkannya ke fungsi lain, memberikannya kepada pembolehubah setempat, atau menggunakannya sebagai nilai pulangan memerlukan kaedah khas seperti penunjuk fungsi dan perwakilan.
Dalam dunia JavaScript, fungsi adalah warga kelas pertama Mereka bukan sahaja mempunyai semua cara menggunakan fungsi tradisional (pengisytiharan dan panggilan), tetapi juga boleh menetapkan nilai, lulus parameter, dan mengembalikan seperti nilai mudah -fungsi kelas pertama. Bukan itu sahaja, fungsi dalam JavaScript juga bertindak sebagai pembina kelas dan merupakan contoh kelas Fungsi. Pelbagai identiti sedemikian menjadikan fungsi JavaScript sangat penting.
1. Fungsi JavaScript peringkat permulaan
Seperti bahasa lain, fungsi JavaScript mengikut prinsip pengisytiharan dahulu dan digunakan kemudian Nama fungsi hanya boleh mengandungi huruf, nombor, garis bawah atau $ dan tidak boleh bermula dengan nombor. Terdapat dua cara biasa untuk mengisytiharkan fungsi:
Perhatikan bahawa terdapat perbezaan yang ketara antara dua kaedah pengisytiharan fungsi di atas: kaedah pertama ialah fungsi yang dinamakan apabila diisytiharkan, sama ada ia diisytiharkan sebelum panggilan, selepas panggilan, atau bahkan dalam kedudukan yang tidak akan dilaksanakan (seperti penyataan pulangan atau dalam cawangan yang tidak akan pernah benar), boleh diakses dalam keseluruhan skop cara kedua ialah dengan memberikan fungsi tanpa nama kepada pembolehubah, yang bukan sahaja pengisytiharan fungsi (pengisytiharan fungsi ) ialah fungsi; ekspresi. Fungsi ini tidak boleh diakses oleh mana-mana kod sebelum tugasan, yang bermaksud bahawa tugasan mesti diselesaikan sebelum memanggil, jika tidak, ralat akan berlaku semasa memanggil: "TypeError: undefined is not a function ". Contohnya:
2. Fungsi JavaScript lanjutan
2.1 Fungsi tanpa nama dan fungsi bersarang
Dalam JavaScript, anda boleh mengisytiharkan fungsi tanpa nama, dipanggil fungsi tanpa nama. Pada masa yang sama, JavaScript juga membenarkan fungsi diisytiharkan dalam fungsi, dipanggil fungsi bersarang Skop fungsi bersarang ialah keseluruhan fungsi induk.
Dalam bahagian pengisytiharan fungsi sebelumnya, kami melihat penggunaan fungsi tanpa nama dan fungsi bersarang Oleh kerana fungsi tanpa nama tidak mempunyai nama, ia tidak akan memperkenalkan pembolehubah baharu untuk mencemarkan konteks, dan akan membawa skop pembolehubah baharu digunakan untuk mencegah pencemaran alam sekitar global.
Terdapat persekitaran global khas (objek global) dalam masa jalan JavaScript Objek ini menyimpan fungsi dan pembolehubah global Dalam pembangunan sebenar, beberapa perpustakaan pihak ketiga atau berbilang fail js sering digunakan atau pengisytiharan fungsi akan menyebabkan kekeliruan dalam pelaksanaan kod. Sebagai contoh, dua fail js diperkenalkan satu demi satu, dan masing-masing mentakrifkan log fungsinya sendiri untuk kegunaan dalaman Fungsi kedua yang diperkenalkan akan menimpa definisi pertama dan tidak akan menyebabkan sebarang ralat memanggil fungsi log dalam pelaksanaan berikutnya. menyebabkan kesilapan. Pada masa ini, menggunakan fungsi tanpa nama untuk membungkus logik dalam keseluruhan js boleh mengelakkan ralat ini. Kaedah ini telah digunakan oleh kebanyakan perpustakaan js sumber terbuka.
Kod di atas ialah contoh mudah Skop fungsi log terhad kepada fungsi tanpa nama ini, dan fungsi tanpa nama dikelilingi oleh sepasang kurungan () di luar untuk membentuk ungkapan fungsi fungsi, diikuti dengan sepasang kurungan untuk menunjukkan bahawa fungsi itu akan dilaksanakan serta-merta, membenarkan kod asal dilaksanakan secara normal. Walau bagaimanapun, fungsi yang diisytiharkan dengan cara ini, pembolehubah yang diisytiharkan melalui var, dsb. adalah dalaman dan tidak boleh diakses oleh mana-mana kod selain daripada fungsi tanpa nama. Jika anda perlu mendedahkan beberapa fungsi sebagai antara muka, terdapat beberapa kaedah:
2.2 Fungsi Tertib Tinggi
Jika fungsi digunakan sebagai parameter atau nilai pulangan, ia dipanggil fungsi tertib tinggi Semua fungsi dalam JavaScript boleh digunakan sebagai fungsi tertib tinggi Ini juga merupakan ciri jenis fungsi pertama. Di bawah ini kami akan menganalisis kedua-dua kaedah penggunaan ini masing-masing.
Kod di atas menunjukkan contoh menghantar fungsi sebagai parameter ke dalam panggilan proses fungsi yang lain Dalam pelaksanaan fungsi proses, panggilan balik dianggap sebagai kotak hitam, bertanggungjawab untuk menghantar parameter kepadanya, dan kemudian mendapatkannya. nilai pulangan Pelaksanaan khusus panggilan balik tidak jelas sebelum ini. Hanya apabila baris 20 dan 22 dilaksanakan, panggil balik masing-masing diwakili oleh negatif atau segi empat sama, dan operasi nilai bertentangan atau kuasa dua dilakukan pada setiap elemen masing-masing.
2.3 Penutupan
Penutupan (Penutupan) bukanlah konsep baharu yang digunakan dalam banyak bahasa berfungsi. Dalam JavaScript, penutupan digunakan apabila anda menggunakan pembolehubah dalam skop fungsi luaran dalam fungsi sebaris. Gunakan analogi biasa untuk menerangkan hubungan antara penutupan dan kelas: kelas ialah data dengan fungsi, dan penutupan ialah fungsi dengan data.
Satu ciri pembolehubah yang digunakan dalam penutupan ialah ia tidak dikeluarkan apabila fungsi induk kembali, tetapi berakhir apabila kitaran hayat penutupan tamat. Sebagai contoh, seperti contoh penjana dalam bahagian sebelumnya, gen1 dan gen2 menggunakan pembolehubah bebas i (apabila i gen1 meningkat sebanyak 1, i gen2 tidak terjejas, dan sebaliknya), selagi gen1 atau gen2 Jika kedua-dua pembolehubah bukan sampah yang dikumpul oleh enjin JavaScript, pembolehubah i masing-masing tidak akan dikeluarkan. Dalam pengaturcaraan JavaScript, penutupan digunakan secara tidak sedar Walaupun ciri penutupan ini membawa kemudahan penggunaan, ia juga boleh menyebabkan masalah seperti kebocoran memori. Contohnya:
Salin kod
Fungsi JavaScript juga berfungsi sebagai pembina kelas, jadi selagi anda mengisytiharkan fungsi, anda boleh menggunakan kata kunci baharu untuk mencipta contoh kelas.
3. Tahap raksasa fungsi JavaScript
Selamat datang ke kawasan pengajaran fungsi peringkat raksasa, di mana kami akan mengajar anda cara menghadapi raksasa dengan tenang dan selesa. . .
Kelas fungsi 3.1
Terdapat kelas terbina dalam yang dipanggil Fungsi dalam masa jalan JavaScript. Mengisytiharkan fungsi dengan kata kunci fungsi sebenarnya adalah bentuk ringkas untuk mencipta objek kelas Fungsi Semua fungsi mempunyai semua kaedah kelas Fungsi, seperti panggilan, gunakan, dan ikat. Tunggu, anda boleh mengesahkan kenyataan ini melalui kata kunci instanceof.
Oleh kerana Function ialah kelas, pembinanya ialah Function (itu sendiri juga merupakan objek kelas Function), dan ia sepatutnya boleh menjana objek fungsi melalui kata kunci baharu. Inilah raksasa pertama, iaitu cara membina fungsi menggunakan kelas Fungsi. Sintaks Fungsi adalah seperti berikut:
3.2 Fungsi kemas kini diri
Dalam banyak bahasa, sebaik sahaja fungsi diisytiharkan, ia tidak boleh mengisytiharkan fungsi dengan nama yang sama sekali lagi, jika tidak ralat sintaks akan berlaku Walau bagaimanapun, fungsi dalam JavaScript bukan sahaja boleh diisytiharkan berulang kali, tetapi juga mengemas kini sendiri. Raksasa yang makan sendiri ada di sini!