2015-12-04 17 views
6

eval işlevini bir kurucu olarak garip bir şekilde kullanıyorum.Tüm JavaScript fonksiyonları kurucular değil mi?

try { 
    var y = new eval() 
} catch(error) { 
    console.log("caught a " + error.name + ": " + error.message); 
} 

Sanki hatayı atar, hata mesajı gösterdiği gibi

caught a TypeError: function eval() { [native code] } is not a constructor 

, eval bir işlev değil, bir yapıcı olduğunu.

Sorun şu ki, javascript işlevleri de kurucu olarak davranmıyor mu?

+0

eval ayrılmış bir anahtar sözcük/yerel bir işlevdir. Buna karışma. –

+2

Hayır, diğer bazı olası istisnalar bazı _DOM_ yöntemleri ve _arrow işlevleri_ 'x => undefined' –

+0

Anlaşıldı, eval yerleşik bir işlevdir. Eğer kendi fonksiyonunuzu yaptınız myEval() {} 've daha sonra bu kodu kullanmalısınız. –

cevap

6

Tüm işlevler yapıcı değildir.

Oluşturucular, tüm işlevlerin sahip olmadığı function values with a [[Construct]] internal property şeklindedir. Bu dil spec 6.1.7.2 Object Internal Methods and Internal Slots sarahaten yapılır:

bir fonksiyon amacı, bir kurucu ve non-yapıcı işlevi nesneleri [[Construct]] dahili yöntem yok olmak zorunda değildir. Bir yapıcı bir TypeError atar gibi olmayan kurucusunu çağırmak için new veya Reflect.construct kullanma

.

+0

Bunun pratik etkileri nelerdir? Bir javascript işlevi yazarsam, bu [[Construct]] iç yöntemi ile otomatik olarak etiketlenir mi? –

+0

@JohnCarpenter, fonksiyonun nasıl oluşturulduğuna bağlıdır. @PaulS'un yukarıda belirttiği gibi, ok işlevi sözdizimini kullanarak bir işlev oluşturmak, [[Construct]] özelliğine sahip olmayacağı anlamına gelir. 'Function' anahtar sözcüğünü kullanmak genellikle yapıya uygun bir işlev üretecektir. –

+0

Huh, bunu bilmediğimi bilmediğim şeylerin listesine ekleyin. –