İşlev ifadesinin önünde JavaScript artı işareti


866

Hemen çağrılan işlevler hakkında bilgi arıyordum ve bir yerde bu gösterimde tökezledim:

+function(){console.log("Something.")}()

Birisi bana +işlevin önündeki işaretin ne anlama geldiğini / ne anlama geldiğini açıklayabilir mi?


17
Ben Alman her şeyi burada açıklıyor: mths.be/iife
Mathias Bynens

Yanıtlar:


1320

Ayrıştırıcıyı, +ifadesini izleyen bölümü işlemeye zorlar . Bu genellikle hemen çağrılan işlevler için kullanılır, örneğin:

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

+Orada olmadan, ayrıştırıcı bir ifade (veya bir ifade veya birkaç ifade olmayan ifade olabilir) beklediği bir durumdaysa, sözcük bir işlev ifadesinden ziyade functionbir işlev bildiriminin başlangıcı gibi görünür ve bunu takip eder. (yukarıdaki satırın sonundaki olanlar) bir sözdizimi hatası olacaktır (bu örnekte bir adın olmaması gibi). İle , bir işlev ifadesi yapar, bu da adın isteğe bağlı olduğu ve çağrılabilen işleve başvuru ile sonuçlandığı ve parantezlerin geçerli olduğu anlamına gelir.()+

+seçeneklerden sadece biri. Ayrıca olabilir -, !, ~, ya da sadece başka bir tekli operatöründen hakkında. Alternatif olarak, parantezleri kullanabilirsiniz (bu daha yaygındır, ancak sözdizimsel olarak ne daha fazla ne de daha az doğrudur):

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

12
Daha fazla ayrıntı burada, benalman.com/news/2010/11/…
Kundan Singh Chouhan

159
Ebeveyn paketlemesinin üstün bir gösterim olduğunu söyleyemeyiz mi? İfadeleri kapsamak için hizmet veren parens çok ÇOK aşina değilim. Eğer js bu gizemli tuhaflık bilmiyorsanız bu durumda + ne yapıyor hiç belli değil.
Chris

1
Not: İki parens seçeneğinden jsLint ikincisini tercih eder. Ben jsHint daha az telaşlı olduğunu düşünüyorum .
Pancar-Pancar

43
"Artı" gösterimini kullanan yaygın olarak kullanılan kitaplıklardan biri Bootstrap'tir (işte bu konuyu okudum).
Ville


94

@ TJCrowder'ın cevabına bağlı olarak +, genellikle bu SO cevabının açıkladığı gibi bir değerin sayısal olarak dökümünü zorlamak için kullanılır . Bu örnekte 'tekli artı operatör' (googling kolaylığı için) olarak adlandırılır.

var num = +variant;

Dolayısıyla, bir işlevin önünde, işlevin sonucunu bir sayı olarak yorumlanmaya zorlamanın bir yolu olabilir. Henüz gerçekleştiğinden şüpheliyim, ancak teorik olarak JIT işlevi sadece sayısal bir işlev vb. Olarak derlemek için kullanabilir. Ancak, tekli artı daha büyük bir ifadede kullanıldığında bir birleştirme olmasını önlemek için parantez gerekir:

blah + (+(function(){ var scope; return "4"; })());

3
Bu nasıl 37 oy aldı? (+function() { ... })()Notasyonu (Bu soruya cevap vermez gerçeği dışında) hatasız yürütmek olamaz.
whitequark

6
@whitequark: İşlev + çağrısının etrafında bir çift parantez kaçırdı. Şüpheli upvotes, sayı döküm açıklaması nedeniyle daha fazla idi.
Phil H

10
Tamam, alaycı olabilirdim.
whitequark

2
@Christoph Bu köşeli parantezleri orada bırakma eğilimindeydim. Aslında, eksik olsaydı onları ekleyecek kadar ileri giderdim. Neler olup bittiğini çok daha net hale getirir ve aynı zamanda boşlukları kaldırarak kodun en aza indirilmesiyle ilgili sorunları önler 3++function....
Benjam

3
Daha fazla düşünmeye rağmen, +function...kendi içinde gereksizdir. Aynı sonuç blah + function( ){ ... }( );, sargı braketlerine olan ihtiyacı da ortadan kaldırabilir .
Benjam

60

Bu nedenle kısa cevap, işlev sonuçlarını bir şekilde kullanarak sözdizimi hatasını önler.

voidOperatöre kullanarak motora dönüş değeri ile bile ilgilenmediğinizi de bildirebilirsiniz :

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

Tabii ki, her şeyin etrafında parantez koymak da bu amaca hizmet eder.


45
Boşluk veya parantezler son derece tercih edilir. WTF içermezler. + Kullanmak, çok akıllı olmayan bir zekadır.
Peter Wone

2
İyi bir nokta. Operatörlerden birini kullanmak, şu anda endüstri standardı olan şeye karşı hareket edecek gibi görünüyor. Belki de "cool kid" geliştiricileri bunu tercih eder, aksi halde hala void yerine bir şey kullanma noktasını
görmüyorum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.