Zaten bazı çok iyi cevaplar var, ancak aşağıdaki III . Davadaki gözlemimi vurgulamak için yeni bir mesaj yayınlıyorum new. Aşağıdaki durumlara bir göz atın:
Durum I :
var Foo = function(){
this.A = 1;
this.B = 2;
};
console.log(Foo()); //prints undefined
console.log(window.A); //prints 1
Yukarıda işaret edilen anonim işlevi çağırmak için basit bir durum Foo. Bu işlevi çağırdığınızda geri döner undefined. Açık bir dönüş ifadesi olmadığından, JavaScript yorumlayıcısı return undefined;işlevin sonuna zorla bir ifade ekler . Burada pencere thisyeni Ave Bözellikleri alan çağırma nesnesidir (bağlamsal ) .
Durum II :
var Foo = function(){
this.A = 1;
this.B = 2;
};
var bar = new Foo();
console.log(bar()); //illegal isn't pointing to a function but an object
console.log(bar.A); //prints 1
Burada newanahtar kelimeyi gören JavaScript yorumlayıcısı this, anonim işlevin işaretleme nesnesi (bağlamsal ) olarak işlev gören yeni bir nesne oluşturur Foo. Bu durumda Ave Byeni oluşturulan nesnenin özellikleri haline (pencere nesnesi yerine). Açık bir dönüş ifadeniz olmadığından, JavaScript yorumlayıcısı, newanahtar kelime kullanımı nedeniyle oluşturulan yeni nesneyi döndürmek için zorla bir dönüş ifadesi ekler .
Durum III :
var Foo = function(){
this.A = 1;
this.B = 2;
return {C:20,D:30};
};
var bar = new Foo();
console.log(bar.C);//prints 20
console.log(bar.A); //prints undefined. bar is not pointing to the object which got created due to new keyword.
Burada yine newanahtar kelimeyi gören JavaScript yorumlayıcısı this, anonim işlevin işaretleme nesnesi (bağlamsal ) olarak işlev gören yeni bir nesne oluşturur Foo. Tekrar Ave Byeni oluşturulan nesnenin özellikleri haline gelir. JavaScript yorumlayıcısı böylece Ama bu sefer açık bir dönüş bildirimde değil kendi şey yapmak.
III durumunda dikkat edilmesi gereken şey, newanahtar kelime nedeniyle oluşturulan nesnenin radarınızdan kaybolmasıdır. baraslında tamamen farklı bir nesneye işaret ediyor, bu da newanahtar kelime nedeniyle JavaScript yorumlayıcısının oluşturduğu nesne değil .
David Flanagan'dan JavaScripit'ten alıntı: The Definitive Guide (6. Baskı), Ch. 4, Sayfa # 62:
Bir nesne oluşturma ifadesi değerlendirildiğinde, JavaScript ilk önce tıpkı {} nesne başlatıcısı tarafından oluşturulan gibi yeni bir boş nesne oluşturur. Ardından, yeni nesneyi bu anahtar kelimenin değeri olarak ileterek belirtilen işlevi belirtilen bağımsız değişkenlerle çağırır. İşlev daha sonra yeni oluşturulan nesnenin özelliklerini başlatmak için bunu kullanabilir. Yapıcı olarak kullanılmak üzere yazılan işlevler bir değer döndürmez ve nesne oluşturma ifadesinin değeri yeni oluşturulan ve başlatılan nesnedir. Bir kurucu bir nesne değeri döndürürse, bu değer nesne oluşturma ifadesinin değeri olur ve yeni oluşturulan nesne atılır.
--- Ek Bilgi ---
Yukarıdaki durumlarda kod snippet'inde kullanılan işlevlerin JS dünyasında aşağıdaki gibi özel adları vardır:
Durum I ve II - Yapıcı işlevi
Durum III - Fabrika fonksiyonu. Fabrika fonksiyonları olmamalı kullanılmalıdır newGeçerli iş parçacığı kavramını açıklamak için yaptık anahtar kelime.
Bunlar arasındaki farkı bu başlıkta okuyabilirsiniz .