Sintaks pemanggilan fungsi langsung

110

Ada opsi JSLint , salah satu dari The Good Parts, yang "[membutuhkan] parens di sekitar pemanggilan langsung," yang berarti bahwa konstruksi

(function () {

  // ...

})();

sebagai gantinya perlu ditulis sebagai

(function () {

  // ...

}());

Pertanyaan saya adalah - adakah yang bisa menjelaskan mengapa bentuk kedua ini bisa dianggap lebih baik? Apakah lebih tangguh? Lebih sedikit rawan kesalahan? Keuntungan apa yang dimilikinya dibandingkan bentuk pertama?


Sejak mengajukan pertanyaan ini, saya telah memahami pentingnya memiliki perbedaan visual yang jelas antara nilai fungsi dan nilai fungsi. Pertimbangkan kasus di mana hasil seruan langsung berada di sisi kanan ekspresi tugas:

var someVar = (function () {

  // ...

}());

Meskipun tanda kurung terluar secara sintaksis tidak diperlukan, tanda kurung buka memberikan indikasi di muka bahwa nilai yang ditetapkan bukanlah fungsi itu sendiri melainkan hasil dari fungsi yang dipanggil.

Ini mirip dengan saran Crockford tentang kapitalisasi fungsi konstruktor - ini dimaksudkan sebagai petunjuk visual bagi siapa pun yang melihat kode sumber.

Bobby Eickhoff
sumber
Terima kasih telah menunjukkan hal ini. Saya tidak pernah menemukan cara bagaimana menghilangkan pesan peringatan JSLint "Hati-hati saat membuat fungsi dalam satu lingkaran." Saya berhati-hati, dan telah menutup fungsinya tetapi JSLint masih mengeluh. Sekarang saya tahu bahwa diasumsikan bahwa saya menggunakan pola kedua.
viam0Zah
Saya telah melakukannya "salah" selama ini. Dan ketika saya mengatakan "selama ini", saya telah menulis JavaScript sejak 1995.
Dave Land

Jawaban:

73

Dari panduan konvensi gaya Douglass Crockford : (telusuri "dipanggil segera")

Jika suatu fungsi akan dipanggil segera, seluruh ekspresi pemanggilan harus dibungkus dalam tanda kurung sehingga jelas bahwa nilai yang dihasilkan adalah hasil dari fungsi dan bukan fungsi itu sendiri.

Jadi, pada dasarnya, dia merasa lebih jelas perbedaan antara nilai fungsi dan nilai fungsi. Jadi, ini masalah gaya, bukan perbedaan mendasar dalam kode itu sendiri.

referensi yang diperbarui, PPT lama sudah tidak ada

cgp
sumber
1
Saya senang saya membaca ini. Saya baru saja selesai membaca Javascript: The Good Parts, dan yang terus saya pikirkan adalah menetapkan hasil pemanggilan suatu fungsi benar-benar sintaks yang buruk, karena Anda harus melihat baris pertama dan terakhir untuk memahami apa yang terjadi. Dia tidak menggunakan paren pembungkus dalam buku, tapi saya mengerti mengapa dia merekomendasikannya.
Skilldrick
2
@altCognito, dapatkah Anda memberikan tautan baru untuk PPT?
th1rdey3
1
Saya melihat-lihat web, tetapi saya masih tidak dapat menemukan salinan PPT itu
Forethinker
1
Saya tidak dapat menemukan PPT aslinya, tetapi saya dapat menemukan poin yang sama yang ditemukan di panduan konvensi javascript-nya.
cgp
archive.org memilikinya?
John Greene
2

Fungsi Anonim yang Segera Disebut terbungkus dalam tanda kurung karena:

  1. Mereka adalah ekspresi fungsi dan meninggalkan tanda kurung akan menyebabkannya ditafsirkan sebagai deklarasi fungsi yang merupakan kesalahan sintaksis.

  2. Ekspresi fungsi tidak boleh dimulai dengan fungsi kata.

  3. Saat menetapkan ekspresi fungsi ke variabel, fungsi itu sendiri tidak dikembalikan, nilai yang dikembalikan dari fungsi tersebut dikembalikan, maka orang tua mengevaluasi apa yang ada di dalamnya dan menghasilkan nilai.ketika fungsi dijalankan, dan tanda kurung di belakang ..}()menyebabkan fungsi segera dijalankan.

Dathan
sumber
Dathan, Anda menjawab pertanyaan yang berbeda. Anda benar bahwa terkadang tanda kurung yang melingkupi diperlukan secara sintaks sehingga pengurai dapat membedakan ekspresi fungsi dari deklarasi fungsi. Tapi pertanyaan saya adalah tentang penempatan tanda kurung doa. Poin ketiga Anda tidak akurat; kurung tutup tidak diperlukan dalam kasus itu.
Bobby Eickhoff
Saya menjawab contoh pertama Anda di mana Fungsi Anonim Panggilan Segera tidak ditetapkan ke variabel dan oleh karena itu tanda kurung diperlukan secara sintaksis untuk 2 alasan pertama. Alasan ke-3 hanya mengembalikan apa yang Anda katakan: "kurung buka memberikan indikasi di muka bahwa nilai yang ditetapkan bukanlah fungsi itu sendiri melainkan hasil dari fungsi yang dipanggil." Tapi saya rasa itu tidak jelas.
Dathan
-3

Atau, gunakan:

void function () {
...
} ()
Agamemnus
sumber