Przekazanie parametru do function(){} |
Przekazanie parametru do function(){} |
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
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. |
|
|
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/
|
|
|
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.
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 |
|
|
10.11.2012, 23:26:55
Post
#4
|
|
Developer Grupa: Moderatorzy Postów: 3 045 Pomógł: 290 Dołączył: 20.01.2007 |
|
|
|
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. |
|
|
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ń:
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
|
|
|
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
|
|
|
11.11.2012, 10:41:16
Post
#8
|
|
Grupa: Zarejestrowani Postów: 125 Pomógł: 14 Dołączył: 2.06.2010 Ostrzeżenie: (0%) |
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. |
|
|
Wersja Lo-Fi | Aktualny czas: 19.04.2024 - 18:39 |