Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Przekazanie parametru do function(){}
radziopoke
post 10.11.2012, 18:00:04
Post #1





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Crozin
post 10.11.2012, 18:02:18
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Przecież ten kod działa poprawnie: http://jsfiddle.net/WvrtZ/
Go to the top of the page
+Quote Post
radziopoke
post 10.11.2012, 23:17:39
Post #3





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował radziopoke 10.11.2012, 23:21:39
Go to the top of the page
+Quote Post
webdice
post 10.11.2012, 23:26:55
Post #4


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




[JAVASCRIPT] pobierz, plaintext
  1. setTimeout( function()
  2. {
  3. twojaFunkcja( parametr );
  4. }, 1000)
[JAVASCRIPT] pobierz, plaintext
Go to the top of the page
+Quote Post
radziopoke
post 10.11.2012, 23:53:26
Post #5





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
thek
post 11.11.2012, 00:04:23
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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ą.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
irmidjusz
post 11.11.2012, 01:12:24
Post #7





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


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();


--------------------
there is much to be learned
Go to the top of the page
+Quote Post
radziopoke
post 11.11.2012, 10:41:16
Post #8





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 18:39