Dodatek 1. Mniej znane instrukcje steruj─ůce

> Dodaj do ulubionych

W rozdziale 2 opisane s─ů najcz─Ö┼Ťciej u┼╝ywane instrukcje steruj─ůce, takie jak while, for i break. Dla uproszczenia w rozdziale tym niekt├│re struktury pomin─ů┼éem, poniewa┼╝ moim zdaniem s─ů o wiele mniej przydatne. W tym dodatku znajduje si─Ö opis tych pomini─Ötych struktur.


Pierwsza z nich to instrukcja do. Dzia┼éa podobnie do instrukcji while, tylko zamiast wykonywa─ç swoje instrukcje zero lub wi─Öcej razy wykonuje je przynajmniej raz. Instrukcja do wygl─ůda nast─Öpuj─ůco:

do {
  var answer = prompt("Powiedz „muuu”.", "");
  print("Powiedzia┼ée┼Ť „", answer, "”.");
} while (answer != "muuu");

Aby podkre┼Ťli─ç fakt, ┼╝e warunek jest sprawdzany dopiero po jednokrotnym wykonaniu kodu p─Ötli, zapisuje si─Ö go za tre┼Ťci─ů g┼é├│wn─ů p─Ötli.


Kolejna instrukcja to continue. Jest ona blisko spokrewniona z instrukcj─ů break i w niekt├│rych przypadkach mo┼╝e j─ů zast─Öpowa─ç. Podczas gdy break powoduje wyskok z p─Ötli i kontynuowanie wykonywania programu od miejsca za p─Ötl─ů, continue powoduje przej┼Ťcie do nast─Öpnej iteracji p─Ötli.

for (var i = 0; i < 10; i++) {
  if (i % 3 != 0)
    continue;
  print(i, " jest podzielne przez trzy.");
}

Podobny efekt mo┼╝na uzyska─ç przy u┼╝yciu samej instrukcji if, ale w niekt├│rych przypadkach instrukcja continue wygl─ůda lepiej.


Je┼Ťli p─Ötla znajduje si─Ö w innej p─Ötli, instrukcje break i continue dotycz─ů tylko wewn─Ötrznej p─Ötli. Czasami jednak trzeba wyj┼Ť─ç z zewn─Ötrznej p─Ötli. Aby m├│c odwo┼éywa─ç si─Ö do wybranej p─Ötli, mo┼╝na przypisa─ç jej etykiet─Ö. Etykieta to nazwa (mo┼╝e by─ç dowolna poprawna nazwa zmiennej) z dwukropkiem (:).

outer: for (var sideA = 1; sideA < 10; sideA++) {
  inner: for (var sideB = 1; sideB < 10; sideB++) {
    var hypotenuse = Math.sqrt(sideA * sideA + sideB * sideB);
    if (hypotenuse % 1 == 0) {
      print("Tr├│jk─ůt prostok─ůtny o przyprostok─ůtnych o d┼éugo┼Ťci ",
            sideA, " i ", sideB, " ma przeciwprostok─ůtn─ů d┼éugo┼Ťci ",
            hypotenuse, ".");
      break outer;
    }
  }
}

Nast─Öpna konstrukcja to switch, kt├│rej mo┼╝na u┼╝ywa─ç do wybierania blok├│w kodu do wykonania zale┼╝nie od jakiej┼Ť warto┼Ťci. Jest to bardzo wygodna konstrukcja, ale jej sk┼éadnia w j─Özyku JavaScript (zapo┼╝yczona z j─Özyka C) jest tak nieporadna i brzydka, ┼╝e zamiast niej wol─Ö u┼╝ywa─ç szereg├│w instrukcji if.

function weatherAdvice(weather) {
  switch(weather) {
    case "deszcz":
      print("We┼║ parasol.");
      break;
    case "słońce":
      print("Ubierz si─Ö lekko.");
    case "chmury":
      print("Wyjd┼║ na dw├│r.");
      break;
    default:
      print("Nie wiadomo, jaka jest pogoda: ", weather);
      break;
  }
}

weatherAdvice("słońce");

W bloku switch mo┼╝na wpisa─ç dowoln─ů liczb─Ö klauzul case. Program przeskoczy do etykiety odpowiadaj─ůcej warto┼Ťci podanej instrukcji switch (por├│wnuj─ůc warto┼Ťci przy u┼╝yciu operacji r├│wnowa┼╝nej z operatorem ===, dzi─Öki czemu nie wyst─ůpi automatyczna konwersja typu) albo do klauzuli default, je┼Ťli nie zostanie znaleziona ┼╝adna pasuj─ůca warto┼Ť─ç. Nast─Öpnie wykona znajduj─ůce si─Ö tam instrukcje oraz b─Ödzie kontynuowa┼é wykonywanie instrukcji kolejnych etykiet, a┼╝ napotka instrukcj─Ö break. W niekt├│rych przypadkach, jak np. "s┼éo┼äce" w przyk┼éadzie, mo┼╝na to wykorzysta─ç do tego, aby m├│c u┼╝y─ç wsp├│lnego kodu dla niekt├│rych przypadk├│w (zalecenie wyj┼Ťcia na dw├│r znajduje si─Ö w przypadku zar├│wno s┼éonecznej jak i wietrznej pogody). Zazwyczaj konstrukcje te wymuszaj─ů tylko dodanie wielu brzydkich instrukcji break albo powoduj─ů problemy, gdy si─Ö o takiej instrukcji zapomni.

Podobnie jak p─Ötle, instrukcje switch mog─ů mie─ç etykiety.


Na koniec zostawi┼éem s┼éowo kluczowe with. Nigdy go nie u┼╝y┼éem w ┼╝adnym prawdziwym programie, ale widzia┼éem je w cudzych programach i dlatego my┼Ťl─Ö, ┼╝e warto je zna─ç. Kod z u┼╝yciem s┼éowa kluczowego with wygl─ůda tak:

var scope = "outside";
var object = {name: "Ignatius", scope: "inside"};
with(object) {
  print("Name == ", name, ", scope == ", scope);
  name = "Raoul";
  var newVariable = 49;
}
show(object.name);
show(newVariable);

Wewn─ůtrz bloku w┼éasno┼Ťci obiektu przekazanego do with zachowuj─ů si─Ö jak zmienne. Aczkolwiek nie s─ů do niego dodawane jako w┼éasno┼Ťci nowo utworzone zmienne. Podejrzewam, ┼╝e konstrukcja ta mia┼éa by─ç przydatna w metodach, w kt├│rych intensywnie wykorzystywane s─ů w┼éasno┼Ťci ich obiekt├│w. Pisanie takiej metody mo┼╝na zacz─ů─ç od with(this) {...} i w├│wczas nie trzeba ci─ůgle pisa─ç this.

Autor: Marijn Haverbeke

Źródło: http://eloquentjavascript.net/1st_edition/appendix1.html

Tłumaczenie: Łukasz Piwko

Tre┼Ť─ç tej strony jest dost─Öpna na zasadach licencji CC BY 3.0