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 this
yeni A
ve 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 new
anahtar 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 A
ve B
yeni oluşturulan nesnenin özellikleri haline (pencere nesnesi yerine). Açık bir dönüş ifadeniz olmadığından, JavaScript yorumlayıcısı, new
anahtar 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 new
anahtar 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 A
ve B
yeni 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, new
anahtar kelime nedeniyle oluşturulan nesnenin radarınızdan kaybolmasıdır. bar
aslında tamamen farklı bir nesneye işaret ediyor, bu da new
anahtar 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 new
Geçerli iş parçacığı kavramını açıklamak için yaptık anahtar kelime.
Bunlar arasındaki farkı bu başlıkta okuyabilirsiniz .