2012-11-04 26 views
11

działa następujący kod w nodejs cli:javascript (nodejs), podczas gdy pętla bug

var my_function = function() {                        
    var next_value = 1 
     , value = undefined 
     , difference = undefined                        
     , prev_difference = undefined                       

    while ((typeof prev_difference === 'undefined') || (prev_difference > 0)) {        
     value = next_value 
     next_value = 2 
     difference = next_value - value 
     if (difference > prev_difference) {                     
       throw new Error('Diminishing') 
     }                             
     prev_difference = 0 
    }                              
    return next_value 
}    

for (var i = 0; i< 300; i++) { console.log(i); console.log(my_function()) } 

Na 282 iteracji pętli zaczynam coraz wartość '1' zamiast '2'. Nie mogę dla życia zrozumieć dlaczego. Ten fragment kodu jest redukcją z czegoś, nad czym pracowałem, stąd pozornie niepotrzebna instrukcja w pętli. Istnieje kilka sposobów na zmianę tego kodu, tak aby ścieżka wykonania nie została zepsuta, ale chciałbym zrozumieć, dlaczego jest ona zerwana z obecną konfiguracją.

Ponadto, jeśli masz jakieś wskazówki dotyczące narzędzi, które mogłyby mi pomóc w debugowaniu czegoś takiego w przyszłości, byłbym bardzo wdzięczny. W większości przypadków użyłem console.log, aby to zawęzić.

wersja node.js v0.8.6. Działa w systemie Mac OSX w wersji 10.7.5. Dzięki

+0

Wydaje mi się, że to błąd węzła; zachowanie jest naprawdę dziwne. (Mogę to również powielić.) * Edit * Przypuszczam, że może to być błąd V8, a nie błąd węzła ... – Pointy

+0

Trippy. Zdarza się też dla mnie. – meetamit

+0

Nie uważasz, że to V8, ponieważ Chrome nie ma tego samego problemu ...? –

Odpowiedz

2

Jeśli wyjmiesz instrukcję IF, wszystko będzie dobrze, powróci tylko "2" w każdej iteracji. Zmienna prev_difference jest "niezdefiniowana" za każdym razem i wydaje się to powodować problemy.

+0

Tak, udało nam się to zrozumieć. Pytanie brzmi: * dlaczego *? Ponieważ nie powinien. Jest całkowicie poprawny do pracy z niezdefiniowanymi zmiennymi w JavaScript. –