Deklarasi Fungsi
function foo () {}Fungsi Foo akan diangkat sebelum seluruh program dieksekusi, sehingga tersedia di seluruh ruang lingkup (ruang lingkup) yang mendefinisikan fungsi FOO. Bahkan menyebutnya sebelum definisi fungsi OK.
foo (); // bekerja karena foo dibuat sebelum kode ini menjalankan fungsi foo () {}Karena saya berencana untuk menulis artikel yang secara khusus memperkenalkan ruang lingkup, saya tidak akan menjelaskannya secara rinci di sini.
Ekspresi fungsi
Untuk deklarasi fungsi, nama fungsi diperlukan, tetapi untuk ekspresi fungsi, itu opsional. Oleh karena itu, ekspresi fungsi anonim dan ekspresi fungsi yang disebutkan muncul. sebagai berikut:
Deklarasi Fungsi: Function FunctionName () {}
Deklarasi Fungsi: Function FunctionName [opsional] () {}
Lalu saya tahu bahwa jika tidak ada nama fungsi, itu pasti ekspresi fungsi, tetapi bagaimana kita harus menilai jika ada nama fungsi?
JavaScript menentukan bahwa jika seluruh tubuh fungsi adalah bagian dari ekspresi, maka itu adalah ekspresi fungsi, jika tidak itu adalah deklarasi fungsi. Berikut ini adalah ungkapannya:
var fuc = foo () {}Mari berikan beberapa contoh ekspresi ekstrem yang lebih ekstrem:
function foo () {} true && function foo () {}Pernyataan di atas hanya untuk membedakan ekspresi fungsi, dan mereka umumnya tidak ditulis seperti ini. Kemudian gunakan contoh perbandingan untuk melihat efeknya:
foo1 (); // foo1 tidak didefinisikan foo2 (); // berfungsi karena foo2 dibuat sebelum kode ini berjalan! function foo1 () {ware ('foo1 works');}; function foo2 () {alert ('foo2 works');};Ekspresi fungsi anonim
var foo = function () {};Contoh di atas menetapkan fungsi anonim ke variabel foo.
foo; // 'tidak terdefinisi'foo (); // Ini meningkatkan tipeerrorvar foo = function () {};Karena VAR adalah deklarasi, variabel foo diangkat (dipromosikan) di sini, jadi ketika program dieksekusi, variabel foo dapat dipanggil.
Namun, karena pernyataan penugasan hanya berlaku saat runtime, nilai foo variabel tidak ditentukan.
Bernama Ekspresi Fungsi
Hal lain yang perlu dibicarakan adalah penugasan fungsi yang disebutkan.
var foo = batang fungsi () {bar (); // works}; bar (); // ReferenceErrorDi sini, bilah fungsi yang disebutkan ditugaskan ke variabel foo, sehingga tidak terlihat di luar deklarasi fungsi, tetapi masih dapat dipanggil di dalam fungsi batang. Ini karena mekanisme JavaScript untuk fungsi penamaan, nama fungsi selalu valid dalam ruang lingkup di dalam fungsi.