Ungkapan Fungsian Bernama dalam JavaScript

Katakan kita mempunyai ungkapan fungsian seperti berikut:

javascriptlet test = function() {
  console.log('!');
};

test(); // akan output '!'

Mari kita beri nama func kepada fungsi kita:

javascriptlet test = function func() {
  console.log('!');
};

test();

Seperti yang anda sudah tahu, anda tidak boleh mengakses fungsi melalui nama ini:

javascriptlet test = function func() {
  console.log('!');
};

test(); // akan output '!'
func(); // akan ralat

Apakah gunanya memberi nama kepada fungsi jika ia tidak akan boleh diakses? Hakikatnya, nama ini tidak boleh diakses dari luar fungsi, tetapi boleh diakses di dalam fungsi itu sendiri.

Mari kita uji:

javascriptlet test = function func() {
  console.log(func); // fungsi akan output kod sumbernya sendiri
};

test(); // panggil fungsi

Mari kita panggil fungsi kita di dalamnya sendiri:

javascriptlet test = function func() {
  console.log('!'); // output '!'
  func(); // panggil diri sendiri
};

test();

Jika kod ini dijalankan, output yang tidak terhingga akan dipaparkan ke konsol.

Sebenarnya, fungsi kita boleh dipanggil di dalamnya sendiri bukan sahaja sebagai func, tetapi juga sebagai test:

javascriptlet test = function func() {
  console.log('!');
  test(); // panggil diri sendiri
};

test();

Apakah perbezaannya? Perbezaannya ialah nama test hanyalah sebuah pembolehubah. Semasa skrip berjalan, fungsi kita mungkin ditulis kepada pembolehubah lain atau dihantar sebagai parameter - dalam kes ini, sambungan antara pembolehubah test dan fungsi mungkin terputus.

Namun, nama func diikat secara tegar kepada fungsi khusus untuk membolehkan akses kepada fungsi kita dari dalamnya sendiri.

Function Expression sedemikian dengan nama fungsi dipanggil ungkapan fungsian bernama.