Alasan menulis:
Saat menulis fungsi di JS, kami biasanya mendeklarasikan fungsi dalam bentuk fungsi konvensi fn () {}. Saat membaca beberapa plug-in yang sangat baik, kami tidak dapat membantu tetapi melihat penciptaan fungsi seperti var fn = fungsi () {}. Apa perbedaan di antara mereka? Hari ini, kita akan berbicara tentang pernyataan fungsi yang menarik ini dalam semangat melanggar casserole sampai akhir.
Deklarasi Fungsi
Kode sampel deklarasi fungsi
Salinan kode adalah sebagai berikut:
fungsi fn () {
console.log ('eksekusi fungsi fn ..');
// kode ..
}
Dengan cara ini, kami mendeklarasikan fungsi bernama FN. Ini sebuah pemikiran. Apakah Anda pikir itu akan dieksekusi jika dipanggil pada fungsi ini? Atau akankah kesalahan dilaporkan?
fn (); // Panggil fungsi FN yang kami nyatakan sebelumnya
Salinan kode adalah sebagai berikut:
fungsi fn () {
console.log ('eksekusi fungsi fn ..');
// kode ..
}
Hasil Output Konsol:
Ya, fungsi FN dapat dipanggil saat ini, jadi mari kita ringkas alasannya di sini.
Meringkaskan:
1: Pada saat ini, fungsi FN adalah hasil dari variabel dan disimpan dalam variabel dalam konteks global secara default (dapat diverifikasi oleh jendela. Nama fungsi)
2: Metode ini adalah deklarasi fungsi, dan mereka sudah tersedia saat memasuki tahap konteks global dan memasuki tahap eksekusi kode. PS: JavaScript akan menginisialisasi lingkungan konteks setiap kali memasuki metode (dari Global → Local)
3: Ini dapat mempengaruhi objek variabel (hanya mempengaruhi variabel yang disimpan dalam konteks)
Ekspresi fungsi
Fungsi Kode Sampel Ekspresi
Salinan kode adalah sebagai berikut:
var fn = function () {
console.log ('FN Fungsi [Ekspresi] menyatakan eksekusi ...')
// kode ..
}
Jadi kami mendeklarasikan fungsi anonim dan mengarahkan referensi ke variabel FN?
Sekali lagi, sebut saja di atas dan di bawah fungsi yang dinyatakan oleh ungkapan ini untuk melihat hasil output konsol.
Salinan kode adalah sebagai berikut:
// Untuk melihat output konsol dengan jelas, kami membuat tanda sebelum dan sesudah setiap panggilan untuk meningkatkan keterbacaan.
console.log ('Sebelum panggilan dimulai ...');
fn ();
console.log ('Panggilan sebelumnya berakhir ...');
var fn = function () {
console.log ('FN Fungsi [Ekspresi] menyatakan eksekusi ...')
// kode ..
}
console.log ('Panggilan dimulai setelah itu ...');
fn ();
console.log ('Panggilan dimulai setelah itu ...');
Hasil Pencetakan Konsol:
Anda dapat melihat bahwa ketika kode dieksekusi untuk pertama kalinya ketika fungsi Fn () dipanggil, prompt adalah: FN bukan fungsi (FN bukan metode), dan operasi diakhiri ketika mengalami kesalahan.
Ini menunjukkan bahwa ketika Fn () dipanggil untuk pertama kalinya, variabel var Fn tidak ada sebagai properti dari objek global, dan konteks fungsi anonim yang dirujuk oleh FN tidak diinisialisasi, sehingga panggilan gagal sebelum itu.
Salinan kode adalah sebagai berikut:
// Sekarang komentari logika panggilan sebelumnya terlebih dahulu, lalu lihat output konsol
// console.log ('sebelum panggilan dimulai ...');
// fn ();
// console.log ('Panggilan sebelumnya berakhir ...');
var fn = function () {
console.log ('FN Fungsi [Ekspresi] menyatakan eksekusi ...')
// kode ..
}
console.log ('Panggilan dimulai setelah itu ...');
fn (); // menelepon setelah ekspresi
console.log ('Panggilan dimulai setelah itu ...');
Hasil Pencetakan Konsol:
Dapat dilihat bahwa tidak masalah untuk memanggil fungsi ekspresi setelahnya. Mari kita ringkas mengapa?
Meringkaskan:
1: Pertama -tama, variabel itu sendiri tidak ada sebagai fungsi, tetapi referensi ke fungsi anonim (tipe nilai bukan milik referensi)
2: Selama tahap eksekusi kode, ketika menginisialisasi konteks global, itu tidak ada sebagai atribut global, sehingga tidak akan menyebabkan kontaminasi objek variabel.
3: Jenis deklarasi ini umumnya umum dalam pengembangan plug-in, dan juga dapat digunakan sebagai panggilan untuk panggilan balik dalam penutupan.
Jadi fungsi fn () {} tidak sama dengan var fn = fungsi () {}, mereka memiliki perbedaan penting.