2010-08-16 21 views

cevap

8

this.foo = new (function() {..})(); 

vs, bir işlev yaratıyor ve this.foo sonucu atama çalıştırmadan. İkinci örnekte, işlev yaratılıyor ve bu işlevin kendisini this.foo'ya atar.

+0

this.foo ikinci örnekte, bir fonksiyon göstergesine denk mi? –

+0

@KennyCason: Bu şekilde bakabilirsiniz. Geçerli bağlamda işlevi foo değişkenine atamaktır. Ancak, foo() {....} 'fonksiyonunun yazılması * tam olarak * aynı şeyi yapar. –

+2

@james oldukça tam olarak 'fonksiyonu fan()' kapsamında, 'this.foo =() işlevi üst kısmında asign olacak 'olan bir işlev geri dönebilirler sağ orada – Rixius

-2

İlk örnek düz yanlış, aslında denedim edilir? Eğer new kullanmak istiyorsanız ve Function yapıcı böyle çalışıyorsa:

foo = new Function("function body"); 

Örnek 2 (Bu bir işlev tanımlama olası en kötü yoludur) gitmek için bir yoldur. İşlev yeni ifadenin parçası olarak adlandırılır , öyle bir:

+0

ilk örnekte anonim işlev atar Daha sonra 'new' operatörüyle kullanılır. Belki anonim işlev bir çeşit nesne fabrikası mıdır? –

+0

Aslında @Ryan, bu ifadenin sağ tarafını (yani, tüm işlev çağrısı) başka bir katmanın katmanına sarmadıkça bunu yapmayacaktır. "Yeni" operatörü en az() gibi sıkı sıkıya bağlar, bu yüzden şu anda yazılmış olduğu gibi (yeni (function() {...}))() gibidir. – Pointy

+0

'new function() {...}' yapmak güzel. Yeni işlev() ile aynı şeyi yapmaz. Tamamen geçerli olan yeni MyConstructor() ile aynı şeyi yapar. –

3

temel fark "yeni" ve değişken

ECMA 262 15.3.2 anonim işlev atama ile işlevini çağırıyor kurucu: yeni oluşturulan nesneyi başlatır.

Yani this.foo = new (function() {..})(); yeni bir nesne oluşturur ve this.foo

ve

this.foo = function(){...}; isimsiz işlev tanımlar atar ve aynı zamanda başka bir yol this.foo = (function() {..})(); ise "Yeni olmadan (

this.foo atar ") işlevi çağırır ve dönüş değerini this.foo

olarak atarsanız, durumunuza dikkat edin:

var foo = new (function() {})(); 
var bar = function() {}; 
var baz = (function() {return "boo";})(); // without the "new" 

alert(foo); // will alert [object Object], the newly created object 
alert(bar); // will alert function) {}, the function itself 
alert(baz); // will alert "boo", the functions return value 
İlgili konular