2015-01-08 20 views
9

Bu kodun daha tamamen atlanır görünüyor ve değerlere sahip olmalıdır değişkenleri "tanımsız" olarak ayarlanır (Mac'te Chrome'da gerçekleşmesi sadece görünür) çok garip bir davranıştır. İşte Değişkenler imkansız "tanımsız" olarak belirlenen

Chrome'un geliştirici araçları bir görüntü var. 817 numaralı hattın asla vurulmadığını unutmayın! Ancak 833 vuruldu ve baktığımız şey çarpılan bir istisnadır ve bu karışıklığı bulmak için çağrı yığınına baktım. Ayrıca, "loc", "lon" ve "tc" değişkenlerinin hepsinin tanımlanmamış olduğunu da unutmayın, bunların her biri 822, 823/824 ve 827/831 numaralı satırlarda değerlendirildiği için mümkün olmamalıdır. Hesaplamalarda bir hata varsa, bu değişkenlerin değerleri benim anlayışımdan NaN olmalıdır.

function getCircle2(latin, lonin, radius) { 
    var locs = new Array(); 
    var lat1 = latin * Math.PI/180.0; 
    var lon1 = lonin * Math.PI/180.0; 
    var d = radius/3956; 
    var x; 
    for (x = 0; x <= 360; x++) { 
     var tc = (x/90) * Math.PI/2; 
     var lat = Math.asin(Math.sin(lat1) * Math.cos(d) + Math.cos(lat1) * Math.sin(d) * Math.cos(tc)); 
     lat = 180.0 * lat/Math.PI; 
     var lon; 
     if (Math.cos(lat1) == 0) { 
      lon = lonin; // endpoint a pole 
     } 
     else { 
      lon = ((lon1 - Math.asin(Math.sin(tc) * Math.sin(d)/Math.cos(lat1)) + Math.PI) % (2 * Math.PI)) - Math.PI; 
     } 
     lon = 180.0 * lon/Math.PI; 
     var loc = new VELatLong(lat, lon); 
     locs.push(loc); 
    } 
    return locs; 
} 

herkes bu sihirbazlık ışık tutmayı Can: Burada

screenshot from Chrome Developer Tools

gerçek kod nedir? Neden bir kesme noktası göz ardı edilmeli ve değişkenler yalnızca bir Mac üzerinde Chrome'da yanlış değerlere sahip olur?

DÜZENLEME:

Ben hata düzeltildi anlaşılıyor. Tüm yaptığım, kendi işlevinde kesme kodunu ayırmak, işlevi bir kez çağırmak, bir istisna attıysa tekrar aradım ve zamanın% 100'ü çalışıyor gibi görünüyordu. Sorunun temel nedeni neydi merak ediyorum.

//new function to isolate the exception 
function getCirclePointOnRadius(deg, lat1, lon1, d, attempt) { 
    attempt = attempt || 1; 
    var maxAttempts = 2; 
    try { 
     var tc = (deg/90) * Math.PI/2; 
     var lat = Math.asin(Math.sin(lat1) * Math.cos(d) + Math.cos(lat1) * Math.sin(d) * Math.cos(tc)); 
     lat = 180.0 * lat/Math.PI; 
     var lon; 
     if (Math.cos(lat1) == 0) { 
      lon = lonin; // endpoint a pole 
     } 
     else { 
      lon = ((lon1 - Math.asin(Math.sin(tc) * Math.sin(d)/Math.cos(lat1)) + Math.PI) % (2 * Math.PI)) - Math.PI; 
     } 
     lon = 180.0 * lon/Math.PI; 
     var loc = new VELatLong(lat, lon); 
     return loc; 
    } 
    catch (e) { 
     console.log2('Error when gathering circle point "' + e + '", trying again', deg, lat1, lon1); 
     if (attempt < maxAttempts) { 
      return getCirclePointOnRadius(deg, lat1, lon1, ++attempt); 
     } 
     else { 
      return 0; 
     } 
    } 
} 

Ve sonra birlikte orijinal (getCircle2 cinsinden) mantığı düzenlenen döngü değiştirin: Eğer http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

Hat 833 olan değişken Kaldırma kurbanı olabilir gibi

for (x = 0; x <= 360; x++) { 
     locs.push(getCirclePointOnRadius(x, lat1, lon1, d)); 
    } 
+0

Yerel dosyalarla veya jsfiddle/codepen gibi bir web sitesinde hata ayıklama yapıyor musunuz? – A1rPun

+0

Evet. Bu bir Net çözümdür. Üretim dosyaları aynı hatayı gösterir, ancak minimize edilmiş javascript dosyalarını kullanır. –

+0

Windows'ta Chrome'da iyi çalışıyor mu? –

cevap

3

görünüyor Muhtemelen fonksiyon kapsamı içinde değişken isim beyanı olarak kaldırılmaktadır. Değişken beyanlarınızı yeniden düzenlemek sorunu çözebilir.

+0

Bu ilginç bir okuma oldu! +1 –

+0

Evet, bence yerindesiniz, Simon. Makaleyi okumak öyle görünüyor. Kullanılan değişkenler her yerde referans alınmakta ve hatta global kapsamda yaşıyor gibi görünmektedir. –

İlgili konular