2012-11-10 18 views
5

Nie rozumiem, co jest nie tak. Mam trzy kody:
pierwszy:setInterval wewnątrz funkcji powoduje błąd: zmienna nie jest zdefiniowana

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
</script> 



drugie:

<script language="JavaScript" type="text/javascript"> 
    function countdown() 
    { 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



trzecie:

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    function countdown() 
    { 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



Pierwszy kod działa poprawnie, drugi produkuje błąd w linii "setInterval": "count nie jest zdefiniowany", a trzeci kod znów działa poprawnie. Zakres zmiennej "count" powinien być globalny dla funkcji setInterval w drugim kodzie. Dlaczego tak nie jest? Używam Mozilla Firefox. Dzięki.

+0

Właśnie znalazłeś jeden z powodów, dla których nie powinieneś używać łańcuchów jako callbacków dla setInterval/setTimeout. Spójrz na powiązane pytania po prawej stronie, założę się, że połowa z nich ma ten sam problem. – Yoshi

Odpowiedz

8

dla wielu powodów, z których jeden po prostu wpadł, nigdy kiedykolwiek przekazać ciąg setTimeout lub setInterval. Zawsze. Mam na myśli to. Nigdy nie ma dobrego powodu.

Przekaż funkcję zamiast tego. Możliwość przekazywania obiektów funkcji jest jedną z najlepszych funkcji JS.

var count = 0; 
alert(count); 

var timer = setInterval(function(){ 
    count = count + 1; 
    alert(count); 
}, 10000); 

Problem, przed którym stoisz, polega na tym, że kod jako ciąg w ten sposób nie będzie respektował zakresu. Będzie wykonywany w zasięgu globalnym, który jest miejscem, w którym twoja zmienna nie istnieje w Twoim drugim i trzecim fragmencie. I pierwszy fragment kodu działa, ponieważ count jest rzeczywiście zmienną globalną.

Inne problemy z tym związane wynikają z faktu, że w rzeczywistości jest to eval, który ma swoje własne bóle głowy i którego najlepiej unikać. Eval is Evil mimo wszystko.

+0

Witaj, Alex Wayne! Dzięki za pomoc. Nie rozumiem jeszcze, dlaczego ciąg jest tak zły, ale spróbuję, podążając za podanym linkiem. Dziwne, że problem nie jest ujęty w czytanych przeze mnie książkach. – GreenBear

+0

Krótko mówiąc, jest źle, ponieważ jest powolny i potencjalnie niebezpieczny (jak eval) i zachowuje się w sposób, jakiego się nie spodziewasz. Wszystkie te rzeczy są rozwiązywane za pomocą rzeczywistej rzeczywistej funkcji. –

Powiązane problemy