2010-11-29 21 views
5

Bellek tüketimi açısından bunlar eşdeğer midir, yoksa bu nesnelerdeki her nesne için yeni bir işlev örneği alıyor muyuz?Anonim işlevler ve bellek tüketimi

var f=function(){alert(this.animal);} 
var items=[]; 
for(var i=0;i<10;++i) 
{ 
    var item={"animal":"monkey"}; 
    item.alertAnimal=f; 
    items.push(item); 
} 

ve

var items=[]; 
for(var i=0;i<10;++i) 
{ 
    var item={"animal":"monkey"}; 
    item.alertAnimal=function(){alert(this.animal);}; 
    items.push(item); 
} 

Ben düzgün çalışması için kapatılması için sırayla o düşünüyorum

DÜZENLEME, ikinci örneği aslında yeni bir fonksiyonu her geçiş yaratacak. Bu doğru mu?

cevap

5

İlk yöntemin pürüsünden geçmelisiniz, çünkü ikincisi, tercüman bu satırı her geçirdiğinde bir işlev oluşturur. JavaScript yerine blok kapsamı fonksiyon kapsamı vardır beri, aynı kapsamda her zaman vardır, bu nedenle bu kudreti optimize edilebilir olması ama bunu her yaratmaz bir uygulama rastlamadık:

Düzenlemenizi İlişkin zaman. Bu tekniği (büyük olasılıkla mümkün olan) optimizasyona güvenmemenizi tavsiye ederim, çünkü bu tekniği kapsamlı olarak kullanırsanız (ki bu, hangi uygulamayı çalıştıracağınızı bilmediğinizden, doğru mu?) Destekten yoksun olan uygulamaların bellek sınırlarını aşabileceğinden emin olabilirsiniz.

1

Uzman değilim, ancak farklı javascript motorlarının bunu farklı şekillerde ele alabiliyormuş gibi görünüyor. Örneğin, V8'in aynı özelliklere erişirken hafıza tüketimini etkileyebilecek gizli sınıflar adı verilen bir şey vardır. Belki biri bunu onaylayabilir veya reddedebilir.

İlgili konular