Ada dua metode utama untuk membuat fungsi dalam JavaScript: Deklarasi Fungsi dan Ekspresi Fungsi. Kedua metode memiliki skenario yang berlaku. Catatan ini terutama berfokus pada beberapa karakteristik utama dari ekspresi fungsi dan skenario penggunaannya, yang dijelaskan di bawah ini.
Fitur utama
• Nama fungsi opsional
Nama fungsi adalah bagian penting dari deklarasi fungsi. Nama fungsi ini setara dengan variabel. Fungsi yang baru didefinisikan akan disalin ke variabel ini. Panggilan ke fungsi perlu dilakukan melalui variabel ini di masa depan. Untuk ekspresi fungsi, nama fungsi adalah opsional, misalnya:
var sub = fungsi (a1, a2) {return a1-a2; }Dalam contoh ini, ekspresi fungsi tidak memiliki nama dan milik ekspresi fungsi anonim. Mari kita lihat contoh berikut:
var sub = fungsi f (a1, a2) {return a1-a2; } console.log (f (5,3)); // metode panggilan tidak benar konsol.log (sub (5,3)); // Metode panggilan yang benarDalam contoh ini, nama ekspresi fungsi adalah f. Nama ini F sebenarnya menjadi variabel lokal di dalam fungsi dan mengacu pada objek fungsi itu sendiri. Ini sangat bermanfaat ketika fungsi rekursif, dan akan dibahas secara rinci nanti.
• Buat selama fase eksekusi (berbeda dari deklarasi fungsi)
Fitur ini adalah bahwa ekspresi fungsi jelas berbeda dari deklarasi fungsi.
Interpreter tidak memperlakukan kedua metode secara merata ketika menguraikan kode JavaScript. Penerjemah pertama akan membaca deklarasi fungsi dan membuatnya tersedia sebelum menjalankan kode apa pun; Sementara untuk ekspresi fungsi, Anda harus menunggu sampai penerjemah dieksekusi ke baris kode di mana ia berada sebelum akan benar -benar diuraikan dan dieksekusi. Misalnya:
console.log (add (1,2)); // "3" console.log (sub (5,3)); // "Identifier Tidak Terduga", fungsi kesalahan tambah (a1, a2) {return a1+a2; } var sub = fungsi (a1, a2) {return a1-a2; }Pernyataan pertama dapat dieksekusi secara normal. Saat mengevaluasi kode, mesin JavaScript menyatakan fungsi pada pass pertama dan menempatkannya di atas pohon sumber melalui proses yang disebut promosi deklarasi fungsi. Dengan kata lain, selama tahap penciptaan lingkungan eksekusi (fungsi disebut tetapi belum memulai eksekusi), deklarasi fungsi akan "hosting". Jadi, bahkan jika kode yang menyatakan fungsi berada di belakang kode yang menyebutnya, mesin JavaScript akan mengangkat deklarasi fungsi ke atas. Namun, jika deklarasi fungsi diubah menjadi ekspresi fungsi, kesalahan akan dilaporkan selama eksekusi. Alasannya adalah bahwa sebelum menjalankan pernyataan di mana fungsi berada, sub variabel tidak berisi referensi ke fungsi. Dengan kata lain, sub variabel akan ditetapkan selama tahap eksekusi kode. Kecuali untuk perbedaan di atas, dalam aspek lain, sintaks deklarasi fungsi dan ekspresi fungsi setara.
• Jangan mempengaruhi objek variabel
var sub = fungsi f (a1, a2) {console.log (typeof f); // "fungsi" return a1-a2; } console.log (typeof f); // "ReferenceError yang Tak Terbaik: f tidak didefinisikan (...)"Dari contoh di atas, kita dapat melihat bahwa nama fungsi f hanya dapat digunakan di dalam objek fungsi, dan nama fungsi ekspresi fungsi tidak ada dalam objek variabel.
Gunakan skenario
Ada banyak skenario penggunaan untuk ekspresi fungsi. Berikut ini terutama menjelaskan aplikasi rekursi fungsi dan modularitas kode.
• Rekursi fungsi
Lihat contoh berikut:
function factorial (num) {if (num <= 1) {return 1; } else {return num * factorial (num - 1); }}Ini adalah fungsi faktorial klasik, tetapi satu masalah dengan contoh ini adalah bahwa fungsi fungsi faktorial digabungkan dengan tubuh fungsi. Jika Anda menjalankan pernyataan berikut, Anda akan mendapatkan kesalahan:
var OtherFactorial = faktorial; faktorial = null; console.log (lainfaktorial (5)); // "TipeError yang Tak Terbaik: Faktorial bukanlah fungsi"
Alasan untuk kesalahan adalah bahwa fungsi faktorial akan dipanggil di dalam badan fungsi, dan referensi ke fungsi oleh variabel faktorial telah dibatalkan, sehingga kesalahan dilaporkan. Solusi untuk situasi ini umumnya dapat diselesaikan dengan menggunakan argumen. Callee, yang selalu menunjuk pada fungsi saat ini, misalnya:
function factorial (num) {if (num <= 1) {return 1; } else {return num * arguments.callee (num - 1); }}Dengan cara ini, Anda bisa mendapatkan hasil yang benar dengan mengeksekusi fungsi Faktorial lain di sini. Namun, di bawah mode ketat "ketat", argumen. Callee tidak dapat diakses melalui skrip. Ini adalah cara menyelesaikan masalah ini menggunakan ekspresi fungsi, misalnya:
var factorial = (function f (num) {if (num <= 1) {return 1;} else {return num * f (num - 1);}}); console.log (faktorial (5)); // "120"• Modularitas kode
Tidak ada ruang lingkup level blok dalam JavaScript, tetapi kita dapat menggunakan ekspresi fungsi untuk memodulasi kode JavaScript. Kode modular dapat merangkum detail yang tidak perlu diketahui oleh pengguna, dan hanya mengeksposnya ke antarmuka pengguna yang relevan, sambil menghindari polusi ke lingkungan global, seperti:
var person = (function () {var _name = ""; return {getName: function () {return _name;}, setName: function (newName) {_name = newname;}};} ()); orang.setname ("John"); person.getName (); // "John"Dalam contoh ini, ekspresi fungsi anonim dibuat, yang berisi variabel dan fungsi pribadi modul sendiri; Hasil eksekusi dari ekspresi fungsi ini mengembalikan suatu objek, yang berisi antarmuka publik yang diekspos oleh modul kepada pengguna. Ada banyak bentuk modularitas kode tertentu. Misalnya, dalam beberapa perpustakaan JavaScript yang umum digunakan, fungsi eksekusi langsung yang mirip dengan contoh berikut biasanya digunakan:
(function () {var _name = ""; var root = this; var Person = {getName: function () {return _name;}, setName: function (newname) {_name = newname;}}; root.person = person;} .call (ini)); orang.setname ("John"); person.getName (); // "John"Metode ini secara langsung menggunakan objek yang berisi antarmuka publik modul sebagai atribut objek global, sehingga atribut objek global dapat digunakan di tempat lain.
Ekspresi fungsi javascript klise di atas adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.