2011-05-09 14 views
52

Aşağıdaki kod bloklarının her ikisi de foo ve ardından bar bildiriyor. Tek fark })() ve }())'dur."(function() {})()" ve "(function() {}())" JavaScript’te işlevsel olarak eşit mi?

Kod 1:

(function() 
{ 
    bar = 'bar'; 
    alert('foo'); 
})(); 

alert(bar); 

Kod 2:

(function() 
{ 
    bar = 'bar'; 
    alert('foo'); 
}()); 

alert(bar); 

Yani herhangi bir fark dışında sözdiziminden, var mı?

+1

Ayrıca bkz. [Anonim JavaScript işlevlerini otomatik yürütmek için parantezin konumu nedir?] (Http://stackoverflow.com/questions/3384504/location-of-parenthesis-for-auto-executing-anonymous-javascript-functions) veya [(Function() {…}()) arasında bir fark var mı? ve (function() {…})();?] (http://stackoverflow.com/questions/3783007/is-there-a-difference-between-function-and-function) – Bergi

+1

JS umduğun gibi değil - öyle. tekrar kandırdın! js ilk dil ters piskoloji kullanmak için !!! –

cevap

58

Hayır; Eğer sonradan new önceden ve .something eklerseniz onlar farklı olacaktır,


Ancak aynıdır.

Kod 1

new (function() { 
    this.prop = 4; 
})().prop; 

Bu kod ardından yeni örneğinin prop mülklerini, bu işlevin sınıfının yeni bir örneğini oluşturur.
4 döndürür.

O eşdeğer 2

new (function() { 
    return { Class: function() { } }; 
}()).Class; 

Kod

function MyClass() { 
    this.prop = 4; 
} 
new MyClass().prop; 

için bu kod Class mülkiyet new çağırır.
İşlev çağrısının parantezleri dış parantez kümesinin içinde olduğu için, new ifadesi tarafından alınmazlar ve bunun yerine normal olarak işlevi döndürerek dönüş değerini döndürürler.
ifadesi, .Class ifadesini ayrıştırır ve bunu örneklendirir. o getNamespace sınıf örneğini arayıp Class özelliği dönecekti — (new getNamespace()).Class olarak (new sonra parantezler isteğe bağlıdır)

O getNamespace() çağrısına etrafında parantez olmadan

var namespace = { Class: function() { } }; 

function getNamespace() { return namespace; } 

new (getNamespace()).Class; 
//Or, 
new namespace.Class; 

eşdeğer olduğunu, bu çözümlenen yeni örneğin

+1

'Yeni ... prop' örnekleri faydalıdır. Teşekkürler. –

+1

Rica ederim. – SLaks

+1

Ayrıca, JavaScript'inizde noktalı virgül kullanmıyorsanız, kazayla oluşabilecek bir tanımlayıcı tarafından doğrudan öncelendiğinde de bir fark vardır. 'a (function() {return 5;}())' 'a (5)' a çevirir, 'a (function() {return 5;})() ',' a()() 'ye daha da indirir. yasadışı olan '5()' ye indirger. – Keen

6

Fark yok. Her ikisi de işlev ifadeleridir. (Başka bir operatör de çalışacak yerine + arasında)

+function() { 
    bar = 'bar'; 
    alert('foo'); 
}(); 

en yaygın yolu olsa

(function() { 
    // ... 
})(); 

geçerli:

de bir üçüncü yol, olmak yoktur.

+2

http://jsperf.com/self-invoking-function –

+1

"Kendi kendini çağıran işlev" adı yanıltıcıdır, çünkü işlev kendi bedeninde kendini tekrarlı olarak çağırmaz, ancak * tanımlandıktan hemen sonra * davranır. "Hemen çağrılan işlevi" olarak adlandırmayı tercih ederim. – SasQ

7

hiçbir fark yok - Açılış parantezi yalnızca ne izleyen bir işlev ifadesi yerine işlevi beyanı olan ayrıştırıcı anlatmak için bir sözdizimsel ipucu görevi görür.

İlgili konular