2016-03-26 12 views
1
function func1(str) { 
    eval(str); 
    newVar = 100; 
    function func2() { 
    console.log(bar); 
    console.log(newVar); 
    } 
    func2(); 
} 

func1("bar = 42;"); 

içinde ben (kod yavaş çalışan sonuçlanır) sözcük kapsamını hile çünkü eval() anahtar kelime kaçınarak gerektiğini okudum gelmez tam olarak nasıl. Yukarıdaki örnek bağlamda (veya başka herhangi bir örnek var), ne tür bir derleyici optimizasyonunun kırılmaya başladığını anlamaya çalışıyorum.eval() anahtar kelime molası derleyici optimizasyonlar javascript

Satıra bakarak newVar = 100; Bu değişken de yürütme aşamasında motor (global kapsamda) tarafından oluşturulacaktır. Bunun, sözcük kapsamını 'aldattığını' sanmıyorum. Öyleyse özünde benzer bir şey yapan eval ("bar = 42;") ile ilgili sorun nedir? Umarım soru açıktır. onlar derleyici optimizasyonlar konum ve eval geçirilen kod olduğundan

+0

İşlevler, motorun hangi parçaları görebileceğini ve ne zaman kullanacağını bilmesi durumunda daha hızlı çalışabilir (ayrıştırma zamanında). '' use use '' içinde çalışmayan kod 'eval() 'alt-optimal olarak kullandığınız iyi bir işarettir. – dandavis

+0

Burada ne soruyorsunuz? – amanuel2

+0

bir prosedürü gerçekleştiren cerrah gibi bir işlevi düşünür; Hastanın xray'sinde açık olmayan alanlar varsa, dikkatli bir cerrahi keşif yapılırken operasyonun yapılması daha uzun sürecektir. – dandavis

cevap

2

neredeyse obligatorely yorumlanır.

Halihazırda, modern motorlar muhtemelen bir dizgi değişmezini gerçekleştirmek ve buna göre optimize etmek için yeterince akıllıdır, ancak yeni bir yürütme bağlamı oluşturulur ve bir işlev çağrısını boşa harcarsınız. Sıradan bir programın değerlendirmeyi kullandığı hemen hemen her şey, değerlendirmeden yapılabilir.

function func1(value) 
{ 
    var bar = value; 
    var newVar = 100; 
    function func2() { 
    console.log(bar); 
    console.log(newVar); 
    } 
    func2(); 
} 

func1(42); 
DÜZENLEME: Aslında daha derine inelim. Yukarıdaki kodda, kodun console.log(bar); bölümüne ulaşıldığında bar undefined olacağı herhangi bir durum yoktur. Ve her zaman bir sayı olurdu. Aslında, her zaman 42 olacaktır. Motorun mükemmel bir optimizasyon algoritması olduğu varsayıldığında, örneğin AJAX yanıtından veya bir çeşit kullanıcı girdisinden gelen gibi, değerlendirilmiş kodunuzdaki giriş dinamikse aynı durum geçerli olur mu? Her zaman değil. Ve en iyi duruma getirme işlemlerinin, her zaman son kodda kesmeyi düşündükleri şeylerin SURE olması gerekir.

+1

iyi yazma ve hoş geldiniz. bir nit: 'optimizasyonlar her zaman varsaydıkları şeylerin SURE olması gerekir 'doğru değildir: CPU önbellekleri yol izlemenin yaptığı gibi çok özlüyor, ancak yanlış hesaplamanın hızlı bir şekilde tespit edilmesi durumunda, genellikle doğru tahminler bile işleri hızlandırabilir. – dandavis

+0

Gerçekten de, "Optimizasyonlar" dediğimde, diğer tüm optimizasyonları değil, gelişmiş tür çıkarımı düşünüyordum. Benim hatam. Hoş geldiniz, açıklama ve ilk notv için teşekkür ederim^~ ^ – henry700

İlgili konular