Dalam kasus ekspresi fungsi anonim, fungsinya anonim - secara harfiah, tidak memiliki nama. Variabel yang Anda tetapkan memiliki nama, tetapi fungsinya tidak. (Pembaruan: Itu benar melalui ES5. Mulai ES2015 [alias ES6], seringkali fungsi yang dibuat dengan ekspresi anonim mendapat nama sebenarnya [tetapi bukan pengenal otomatis], baca terus ...)
Nama berguna. Nama dapat dilihat di pelacakan tumpukan, tumpukan panggilan, daftar breakpoint, dll. Nama adalah Good Thing ™.
(Dulu Anda harus berhati-hati terhadap ekspresi fungsi bernama dalam versi IE [IE8 dan yang lebih lama], karena mereka secara keliru membuat dua objek fungsi yang benar-benar terpisah pada dua waktu yang sama sekali berbeda [selengkapnya di artikel blog saya Ambil ganda ]. Jika Anda perlu mendukung IE8 [!!], mungkin yang terbaik adalah tetap menggunakan ekspresi fungsi anonim atau deklarasi fungsi , tetapi hindari ekspresi fungsi bernama.)
Satu hal penting tentang ekspresi fungsi bernama adalah ia membuat pengenal dalam lingkup dengan nama itu untuk fungsi di dalam badan functon:
var x = function example() {
console.log(typeof example);
};
x();
console.log(typeof example);
Namun, pada ES2015, banyak ekspresi fungsi "anonim" membuat fungsi dengan nama, dan ini didahului oleh berbagai mesin JavaScript modern yang cukup pintar dalam menyimpulkan nama dari konteks. Di ES2015, ekspresi fungsi anonim Anda menghasilkan fungsi dengan nama boo
. Namun, bahkan dengan semantik ES2015 +, pengenal otomatis tidak dibuat:
var obj = {
x: function() {
console.log(typeof x);
console.log(obj.x.name);
},
y: function y() {
console.log(typeof y);
console.log(obj.y.name);
}
};
obj.x();
obj.y();
Penetapan nama fungsi dilakukan dengan operasi abstrak SetFunctionName yang digunakan dalam berbagai operasi dalam spesifikasi.
Versi singkatnya pada dasarnya setiap kali ekspresi fungsi anonim muncul di sisi kanan sesuatu seperti penugasan atau inisialisasi, seperti:
var boo = function() { };
(atau bisa jadi let
atau const
lebih daripada var
) , atau
var obj = {
boo: function() { }
};
atau
doSomething({
boo: function() { }
});
(dua yang terakhir itu benar-benar hal yang sama) , fungsi yang dihasilkan akan memiliki nama ( boo
, dalam contoh).
Ada pengecualian penting dan disengaja: Menugaskan ke properti pada objek yang sudah ada:
obj.boo = function() { };
Ini karena masalah kebocoran informasi yang muncul ketika fitur baru sedang dalam proses penambahan; detail dalam jawaban saya untuk pertanyaan lain di sini .