Dodatek 1. Mniej znane instrukcje sterujące

16 stycznia 2013
1 gwiadka2 gwiazdki3 gwiazdki4 gwiazdki5 gwiazdek

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 dostępna jest na zasadach licencji CC BY 3.0

Dyskusja

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *