JavaScript plus sign di depan ekspresi fungsi

Jawaban:

1321

Itu memaksa parser untuk memperlakukan bagian yang mengikuti +sebagai ekspresi. Ini biasanya digunakan untuk fungsi yang dipanggil segera, misalnya:

+function() { console.log("Foo!"); }();

Tanpa di +sana, jika parser berada dalam keadaan di mana ia mengharapkan pernyataan (yang bisa berupa ekspresi atau beberapa pernyataan non-ekspresi), kata tersebut functiontampak seperti awal dari deklarasi fungsi daripada ekspresi fungsi dan karenanya ()mengikutinya (yang ada di akhir baris di atas) akan menjadi kesalahan sintaksis (seperti halnya tidak adanya nama, dalam contoh itu). Dengan yang +, itu membuat ekspresi fungsi, yang berarti nama adalah opsional dan yang menghasilkan referensi ke fungsi, yang dapat dipanggil, sehingga kurung berlaku.

+hanyalah salah satu opsi. Hal ini juga dapat -, !, ~, atau hanya tentang unary operator lainnya. Sebagai alternatif, Anda dapat menggunakan tanda kurung (ini lebih umum, tetapi tidak lebih dan kurang benar secara sintaksis):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
TJ Crowder
sumber
12
Elaborasi lebih lanjut ada di sini, benalman.com/news/2010/11/...
Kundan Singh Chouhan
159
Tidak bisakah kita mengatakan bahwa pembungkus paren adalah notasi yang unggul? Saya SANGAT terbiasa dengan parens yang melayani ekspresi. Tidak jelas sama sekali apa + lakukan dalam kasus ini jika Anda belum tahu ini aneh misterius js.
Chris
1
Catatan: Dari dua opsi parens, jsLint lebih suka yang kedua. Saya pikir jsHint kurang rewel.
Beetroot-Beetroot
43
Salah satu perpustakaan yang umum digunakan yang menggunakan notasi "plus" adalah Bootstrap (yang akhirnya saya baca utas ini).
Ville
Bootstrap melakukan ini, btw: maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
xanderiel
95

Anak perusahaan dari jawaban @ TJCrowder, +biasanya digunakan untuk memaksa casting numerik dari suatu nilai sebagaimana dijelaskan oleh SO ini . Dalam hal ini disebut 'operator plus unary' (untuk kemudahan googling).

var num = +variant;

Jadi di depan fungsi itu bisa menjadi cara untuk memaksa hasil fungsi ditafsirkan sebagai angka. Saya ragu itu belum terjadi, tetapi secara teoritis JIT dapat menggunakannya untuk mengkompilasi fungsi sebagai fungsi numerik-satunya dll. Namun, untuk mencegah unary plus menjadi gabungan ketika digunakan dalam ekspresi yang lebih besar, Anda akan membutuhkan tanda kurung:

blah + (+(function(){ var scope; return "4"; })());
Phil H
sumber
3
Bagaimana ini bisa mendapatkan 37 upvotes? The (+function() { ... })()notasi tidak pernah dapat mengeksekusi tanpa kesalahan (terlepas dari fakta bahwa ini tidak menjawab pertanyaan).
whitequark
6
@ whitequark: Melewatkan sepasang kawat gigi di sekitar fungsi + panggilan. Tersangka upvotes lebih karena penjelasan nomor casting.
Phil H
10
OK saya mungkin telah melakukan nitpicking.
whitequark
2
@Christoph saya cenderung meninggalkan tanda kurung di sana. Bahkan, saya akan menambahkannya jika mereka tidak ada. Itu membuatnya jauh lebih jelas apa yang sedang terjadi, dan juga mencegah masalah ketika kode diminimalkan dengan menghilangkan spasi, yang mengarah ke 3++function...yang tidak sama.
Benjam
3
Meskipun pada refleksi lebih lanjut, +function...itu tidak perlu dalam dirinya sendiri. Hasil yang sama dapat diperoleh dengan blah + function( ){ ... }( );yang akan meniadakan kebutuhan untuk tanda kurung.
Benjam
61

Jadi jawaban singkatnya adalah itu mencegah kesalahan sintaks, dengan menggunakan hasil fungsi dalam satu atau lain cara.

Anda juga dapat menginstruksikan mesin bahwa Anda bahkan tidak tertarik pada nilai pengembalian dengan menggunakan voidoperator:

void function() { console.log("Foo!"); }();

Tentu saja, menempatkan kawat gigi di sekitar semuanya juga melayani tujuan itu.

Mendongkrak
sumber
45
Void atau tanda kurung sangat disukai. Mereka bebas WTF. Menggunakan + adalah jenis kepintaran yang tidak terlalu pintar.
Peter Wone
2
Poin yang bagus. Sepertinya menggunakan salah satu operator akan bertentangan dengan standar industri saat ini. Mungkin pengembang "anak keren" akan memilih untuk itu, kalau tidak aku masih tidak melihat titik menggunakan sesuatu daripada batal atau ()
dudewad