Apa istilah untuk fungsi JavaScript anonim yang dipanggil segera?

29

Saya sedang menulis panduan gaya JavaScript untuk tim saya, sehingga kami dapat mengatur dan berkontribusi dokumen kami dengan lebih mudah. Tapi saya telah menemukan masalah kecil di mana pertanyaan saya berlaku ...

Apa yang harus saya sebut fungsi JavaScript anonim yang dipanggil segera. Saya tahu saya bisa menyebutnya "fungsi anonim", tetapi saya ingin menekankan fakta bahwa itu dipanggil segera.

Berikut ini sebuah contoh:

var MyVariable = (function(data){
  return "another value"
})("some value"); 

console.log(MyVariable);
// "another value"
diamlah
sumber
1
Perhatikan bahwa Anda akan sering melihat konstruk ini (secara tidak akurat) disebut sebagai "fungsi self-calling"
AakashM

Jawaban:

39

Mereka sudah memiliki istilah untuk itu di dunia Javascript. Mereka disebut Ekspresi Fungsi Segera Diminta (IIFE) .

Apa itu

Fungsi IIFE tidak diberi nama. Alih-alih, mereka dieksekusi sekali ketika penerjemah menemukan mereka:

var area = function() {
    var width = 3;
    var height = 2;
    return width * height;
}();

Tanda kurung terakhir setelah kurung kurawal penutupan blok kode memberi tahu juru bahasa untuk memanggil ekspresi fungsi segera.

Jika Anda menulis deklarasi fungsi, Anda harus menambahkan operator pengelompokan , atau tanda kurung di sekeliling fungsi, untuk memberi tahu juru bahasa untuk memperlakukan fungsi tersebut sebagai ekspresi yang dapat langsung dipanggil:

var area;
(function() {
    var width = 3;
    var height = 2;
    area = width * height;
}());


Kapan mereka digunakan

IIFEs digunakan untuk kode yang hanya perlu dijalankan sekali dalam suatu tugas, daripada dipanggil berulang kali.

  1. Sebagai argumen ketika suatu fungsi dipanggil (untuk menghitung nilai, dll.)
  2. Untuk menetapkan nilai properti ke objek.
  3. Pada penangan dan pendengar acara.
  4. Untuk mencegah konflik antara dua skrip yang mungkin menggunakan nama variabel yang sama. Mereka dapat digunakan sebagai pembungkus untuk meletakkan kode di skrip lain di mana Anda tidak yakin apakah nama variabel mungkin sama.
Lawrence Aiello
sumber
Satu nitpick: Dalam contoh Anda menggunakan var area = ..., Anda tidak perlu tanda kurung "membungkus" pada fungsi, karena itu sudah ekspresi fungsi berdasarkan berada di sisi kanan =. Kurung pembungkus hanya diperlukan ketika fungsi ditulis sebagai deklarasi fungsi (yaitu tanpa memimpin var area = ...).
Eric King
@EricKing, apakah saya melakukannya dengan benar?
Lawrence Aiello
Bisa menyenangkan untuk bisa lebih santai menyebut 'fungsi-fungsi ekspres' ini
saringan
@LawrenceAiello Saya menambahkan suntingan untuk menunjukkan apa yang saya maksud. Semoga ini masih bekerja untuk Anda.
Eric King
Sebagai pertanyaan terkait, apakah ada alasan untuk mengajukan argumen kepada IIFE seperti yang ditunjukkan oleh pertanyaan? Saya hanya pernah melihat ini seperti bagaimana Anda menunjukkan - tanpa argumen (karena argumen apa pun bisa menjadi variabel lokal).
Kat