2014-06-05 23 views
5

Adımlar: Firefox 29.0.1 (Windows 7 x64) 'deFirefox neden değişkenin değerini unutuyor? Hata ayıklama çözümü

  1. sayfayı aç:

    <!doctype html> 
    <title>Test</title> 
    <script> 
        (function() { 
         var x = 5, f = function() { 
          setTimeout(f, 1000); 
         }; 
         f(); 
        }()); 
    </script> 
    
  2. Açık Geliştirici Araçları (F12). , Kesme isabet sonra setTimeout(f, 1000);

  3. konsolunda x değerlendirmek: Debugger'daki yılında

  4. , kesme noktası ayarlamak. Sonuç: undefined

    Screenshot showing when <code>x</code> is evaluated

  5. sayfayı yeniden yükleyin. Kesme noktası, f'un ilk çalışmasında vuruldu. x. x. x. Sonuç: Yürütme işlemine devam edip kesme noktası tekrarlandığında x değerini değerlendirin. Aynı sonucu: 5

Benim varsayım: Firefox x gerekli olmadığını f ilk çalıştırmada fark ederse, o zaman f "ile" x değerini saklamaz. Böylece f numaralı çağrılarda x değeri undefined'dur. İlginçtir, aynı davranışı Chrome 35 ve IE11'de görüyorum.

Soru:Neler oluyor? Firefox'u x değerini adım 4'te doğru değere (yukarıdaki gibi) getirecek şekilde yapılandırabilir miyim?

+3

'x' yalnızca işlev içinde var olan ve onu erişmeye çalışıyorsanız: Eğer denemek ve aynı şeyi yaparsanız

İlginç olsa da, Firefox 31 (Aurora) daha açıklayıcı hata mesajı sağlar dışında. – Meredith

+0

Bu sorunu anlamıyorum. Ona adım attığımda doğru değerlendiriliyor. Dev araçlara yerleşik Fox 23.0.1. Bir sayfa yüklerseniz, hata ayıklayıcısını başlatırsanız ve hata ayıklamayı denediğinizde hata ayıklayıcısını doğru şekilde çalışmaz. Çalışmak için sayfayı yüklemek, hata ayıklayıcısını yüklemek, sayfayı yenilemek zorunda kaldım. –

+0

@Meredith 'x 'işlevine, setTimeout (f, 1000); – feklee

cevap

5

Sizin varsayımınızın doğru olduğu görülüyor. Sorun, değişkenin hata ayıklayıcı çalışmadığında optimize edilmiş veya kaldırılmış olmasıdır. Hata ayıklayıcısını çalıştıran sayfayı yenilediğinizde, kodun daha kolay bir şekilde ayıklanabilmesi için işlevlerin iç kapsamlarına erişmenizi sağlar.

Burada bir kesme noktası olmasaydı bu mümkün olmazdı, bu nedenle JIT derleyicisinin bunu yapmanıza izin vermesi gerekir. Çöp toplayıcı, bunların yine de kapsam içinde referans alınabileceğini, dolayısıyla bu değişkenleri kaldırmayacağını da not eder.

JIT derleyicisi çalışıyorsa, x değişkeninin herhangi bir yerde kullanılmadığını ve bunu oluşturulan koddan kaldırdığını kabul eder. JIT derleyicisi, numaralı çalışıyorsa, çöp toplama (GC), değişkene başvuran hiçbir şey olmadığından, GC döngüsü çalışırken değişkeni kaldıracaktır.

Zaten ne yaptığını geri alamayacağından, ilk kez kesme noktasına bastığınızda tanımsızdır.

JIT derleyicisini devre dışı bıraksanız bile bunun gerçekleşmesini gerçekten önleyemezsiniz.Teknik olarak çöp toplama sınırlarını gerçekten denemek ve bunu durdurmak ya da çöp toplama kodunu kaldırmak ve Firefox'u yeniden oluşturmak için gerçekten çok yüksek bir set oluşturabilirdiniz. Bu oldukça aptalca olur. Sadece sayfayı yenilemekten çok daha fazla güçlük var.

Error: variable has been optimized out 
+0

Teşekkürler, özellikle Aurora'nın daha açıklayıcı bir hata mesajı vermesi nedeniyle! Sistemimde bunu doğruladım. BTW cevabınızın ilk satırını kaldırabilirsin: Artık “undefined” aldım. Muhtemelen başka bir sorun vardı ya da hata mesajını kopyaladığımda yanlış sekmede olabilirdim. – feklee

+0

Bu davranış ayrıntılarını bilmek, Firefox'ta doğru uyarır, ama merak ediyorum https://bugzilla.mozilla.org/show_bug.cgi?id=977972, https: // bugzilla gibi daha ciddi hatalar Bu sürümde .mozilla.org/show_bug.cgi? id = 582613 düzeltildi mi? Dürüst olmak gerekirse, her şey Firefox'ta üstün olsa da, çoğu zaman JS hata ayıklayıcısı için Chrome/Chromium'u denemeliyim. – NoBugs

+0

@NoBugs: Üzgünüm, bundan emin değilim - Aurora'yı o kadar fazla kullanmıyorum. –

İlgili konular