Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekazanie parametru do function(){}
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
radziopoke
Zacznę krótkim przykładem
  1. function cos()
  2. {
  3. var a = "wartosc";
  4. setTimeout(function(){
  5. alert(a);
  6. }, 1000);
  7. }

Przykład wygląda jakby nie było w nim żadnego błędu, a jednak alert wyświetli nam, że zmienna nie istnieje.
Dzieje się tak gdyż zmienna a "ginie" zanim wykona się funkcja setTimeout bo jest zmienną lokalną. Zastanawia mnie czy jest jakiś sposób przekazania zmiennej lokalnej do funkcji zawartej w setTimeout?
Użycie zmiennej a jako globalnej nie wchodzi w grę gdyż mogła by ona już dawno zmienić swoją wartość. A mi chodzi o wartość jaką zmienna a miała w momencie użycia funkcji setTimeout.
Crozin
Przecież ten kod działa poprawnie: http://jsfiddle.net/WvrtZ/
radziopoke
No dobra może podałem zły przykład gdyż jak widze javacript zapamietuje zmienne lokalne jako globalne.
  1. function cos()
  2. {
  3. for(var a=0; a<10; a++)
  4. {
  5. if(a==3)
  6. setTimeout(function(){
  7. alert(a);
  8. }, 1000);
  9. }
  10. }
  11.  
  12. cos();


Chodzi mi o to by funkcja w setTimeout wyświetlila 3 a nie 10. Jestem ciekaw czy w jakiś sposób można przekazać parametr tej funkcji.
webdice
[JAVASCRIPT] pobierz, plaintext
  1. setTimeout( function()
  2. {
  3. twojaFunkcja( parametr );
  4. }, 1000)
[JAVASCRIPT] pobierz, plaintext
radziopoke
Po pierwsze do funkcji TwojaFunkcja zostanie przekazana wartość 10 a powinna być 3, a po drugie nie po to tworzę funkcje anonimową by tworzyć zwykłą junkcję.

Odrazu uprzedzam ze wstawienie zamiast funkcji anonimowej, funkcji TwojaFunkcja odpada gdyż w skrypcie mam kilka funkcji anonimowych ale z tego wynika ze bez dodatkowych zmiennych się nie obejdzie.
thek
Poczytaj co robi setTimeout i parametrach. Ona po prostu jako parametr przyjmuje funkcję i czas po jakim ją odpala - nie zatrzymuje działania pętli i stąd masz ten wynik. Chcesz to obejść? Zrób sobie zmienną lokalną, która "zapamięta" wartość owej zmiennej w momencie walnięcia IFa i to ją przekaż do funkcji alertującej. Wszelkie próby operowania na zmiennej po jakiej iteruje pętla to zwyczajne nieporozumienie w tym momencie. To o co Ci chodzi to pewnie coś w deseń:
[JAVASCRIPT] pobierz, plaintext
  1. function cos()
  2. {
  3. for(var a=0; a<1000; a++) {
  4. if(a==5) {
  5. var b = a;
  6. window.setTimeout(
  7. function() {
  8. alert(b);
  9. },
  10. 1000
  11. );
  12. }
  13. }
  14. }
[JAVASCRIPT] pobierz, plaintext
Od razu mówię, że nie jest to "fajne" rozwiązanie. Powinno się przekazywać parametr tak jak napisał webdice. Niestety próba przekazania ich przez function(b) {alert(b);} (czy to samo z a) zakończy się rzuceniem undefined, ponieważ tak naprawdę one już nie istnieją.
irmidjusz
JS nie zapamiętuje zmiennych lokalnych jako globalne. To działa inaczej. W momencie wywołania funkcji, jest zapamiętywany jej kontekst, w jakim została wywołana.

Inny przykład kodu, który wyświetli pożądane 3, to:
Kod
function cos()
{
    for(var a=0; a<10; a++)
    {
        if(a==3){
            var f = function(a){
                setTimeout(function(){
                    alert(a);
                }, 1000);                
            };
            f(a);    
        }
    }
}

cos();
radziopoke
Cytat(thek @ 11.11.2012, 00:04:23 ) *
Poczytaj co robi setTimeout i parametrach. Ona po prostu jako parametr przyjmuje funkcję i czas po jakim ją odpala - nie zatrzymuje działania pętli i stąd masz ten wynik. Chcesz to obejść? Zrób sobie zmienną lokalną, która "zapamięta" wartość owej zmiennej w momencie walnięcia IFa i to ją przekaż do funkcji alertującej.


Wiem co robi setTimeout, dlatego też szukałem sposobu by przekazać parametr to tej funkcji. Dodatkowa zmienna odpada gdyż setTimeout może być w pętli używane kilka razy w różnych momentach więc musiałbym to jakąś zapamiętać to do tablicy zmiennych a potem w funkcjach wiedzieć która zmienna jest dla jakiej funkcji.

Przykład, który został podany przez irmidjisz-a jest chyba najlepszym tego rozwiązaniem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.