• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JavaScript - Zmienna pętli jako parametr funkcji.

0 głosów
401 wizyt
pytanie zadane 9 grudnia 2015 w JavaScript przez Tricker Bywalec (2,630 p.)

Dzień dobry,

Mam problem z pętlą, której zmienna jest parametrem funkcji...
Nie wiem czy dobrze wytłumaczyłem o co mi chodzi, więc po prostu wstawiam kod.

Mam coś takiego:

Slider1.nav[0].onclick = function (){
    Slider1.SlideTo(0);
}
Slider1.nav[1].onclick = function (){
    Slider1.SlideTo(1);
}
Slider1.nav[2].onclick = function (){
    Slider1.SlideTo(2);
}
Slider1.nav[3].onclick = function (){
    Slider1.SlideTo(3);
}
Slider1.nav[4].onclick = function (){
    Slider1.SlideTo(4);

Chcę uzyskać:

for (i=0; i<5; i++) {
    Slider1.nav[i].onclick = function (){
    Slider1.SlideTo(i);
    }
} 

Problem jest taki, że nie dociera do function, tzn. po prostu jest niezdefiniowane.
Ma ktoś jakiś pomysł jak się z tym uporać?

http://stackoverflow.com/questions/3023874/arguments-to-javascript-anonymous-function
Znalzłem taki temat, w którym jedna z odpowiedzi +/- tłumaczy moje rozwiązanie, jednak nie bardzo go rozumiem, przez co nie jestem w stanie tego zastosować.

1 odpowiedź

+1 głos
odpowiedź 9 grudnia 2015 przez Comandeer Guru (608,940 p.)
wybrane 9 grudnia 2015 przez Tricker
 
Najlepsza

Po przeleceniu pętli i będzie miało swoją końcową wartość i to właśnie ona jest przekazywana dalej.

Dlatego w pętlach najlepiej używać albo IIFE:

for ( var i = 0; i < 5; i++ ) {
	( function( i ) {
		Slider1.nav[i].onclick = function (){
		Slider1.SlideTo(i);
	}( i ) )
} 

albo let:

for ( let i = 0; i < 5; i++ ) {
	Slider1.nav[i].onclick = function (){
	Slider1.SlideTo(i);
} 

 

komentarz 9 grudnia 2015 przez Tricker Bywalec (2,630 p.)

Dzięki wielkie za pomoc, sposób pierwszy rzeczywiście działa! :)

for (var i=0; i<5; i++){
    (function(i){
        Slider1.nav[i].onclick = function(){
            Slider1.SlideTo(i);
        }
    }(i));
}

Co do drugiego, to niestety, ale Chrome go jeszcze nie obsługuje;

Uncaught SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode

komentarz 9 grudnia 2015 przez Comandeer Guru (608,940 p.)

Obsługuje w strict mode ;) Faktycznie, zapomniałem o tym, bo wszystkie skrypty mam w strict mode:

"use strict";
//itd.

Z tym, że jeśli nie masz dobrej jakości JS-a, to może się okazać, że przestanie działać ;)

komentarz 9 grudnia 2015 przez Tricker Bywalec (2,630 p.)
edycja 9 grudnia 2015 przez Tricker
Faktycznie, działa. :)

Hm. Uczę się JSa już od 2-3 miesięcy i przyznam, że dopiero teraz spotkałem się z pojęciem strict mode...
Lepiej późno niż wcale :D

Podobne pytania

0 głosów
1 odpowiedź 663 wizyt
pytanie zadane 10 października 2021 w JavaScript przez lysywilkoklak Początkujący (290 p.)
0 głosów
2 odpowiedzi 804 wizyt
pytanie zadane 19 października 2017 w JavaScript przez KerberosKam Nowicjusz (130 p.)
0 głosów
2 odpowiedzi 381 wizyt
pytanie zadane 1 czerwca 2017 w JavaScript przez crova Użytkownik (940 p.)

93,771 zapytań

142,731 odpowiedzi

323,383 komentarzy

63,372 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...