W Parku Jurajskim różne gatunki dinozaurów wymagają różnych poziomów zabezpieczeń - łagodny Brachiosaurus może przebywać w otwartym wybiegu, podczas gdy agresywny Velociraptor potrzebuje wzmocnionego, zamkniętego pomieszczenia. Podobnie w JavaScript mamy trzy różne sposoby deklarowania zmiennych:
var, let i const, z których każdy oferuje inny poziom "zabezpieczeń" i elastyczności.Zmienne w JavaScript to jak oznaczone zagrody w Parku Jurajskim - pozwalają na przechowywanie i organizację danych, do których możemy później się odwoływać. Zanim będziemy mogli użyć zmiennej, musimy ją zadeklarować.
1// Deklaracja zmiennej dinosaur przy użyciu słowa kluczowego var
2var dinosaur = "T-Rex";
3
4// Deklaracja zmiennej height przy użyciu słowa kluczowego let
5let height = 5.6;
6
7// Deklaracja stałej MAX_SPEED przy użyciu słowa kluczowego const
8const MAX_SPEED = 27;Zmienne zadeklarowane za pomocą
var mają zakres funkcyjny, co oznacza, że są widoczne w całej funkcji, w której zostały zadeklarowane.1function monitorDinosaurs() {
2 var count = 5;
3
4 if (count > 3) {
5 var status = "Przekroczono limit bezpieczeństwa!";
6 console.log(status); // "Przekroczono limit bezpieczeństwa!"
7 }
8
9 console.log(status); // "Przekroczono limit bezpieczeństwa!" - zmienna jest dostępna poza blokiem if
10}
11
12// console.log(count); // Błąd! 'count' nie jest zdefiniowane - var ma zakres funkcyjnyTo jak system bezpieczeństwa, gdzie alarm uruchomiony w jednej części parku (wewnątrz bloku
if) nadal jest słyszalny w całym centrum kontroli (funkcja monitorDinosaurs), ale nie poza parkiem.Zmienne zadeklarowane za pomocą
let mają zakres blokowy - są widoczne tylko wewnątrz bloku, w którym zostały zadeklarowane.1function securityCheck() {
2 let safetyStatus = "Normalny";
3
4 if (emergencyDetected) {
5 let alarmLevel = "Czerwony";
6 console.log(alarmLevel); // "Czerwony"
7 }
8
9 // console.log(alarmLevel); // Błąd! 'alarmLevel' nie jest zdefiniowane - zmienna dostępna tylko w bloku if
10}To jak komunikacja przez radio z ograniczonym zasięgiem - informacja o alarmie (zmienna
alarmLevel) jest dostępna tylko w strefie zagrożenia (blok if), a nie w całym centrum dowodzenia.const podobnie jak let ma zakres blokowy, ale dodatkowo wprowadza ograniczenie: raz przypisana wartość nie może być zmieniona.1function setupEnclosure() {
2 const ENCLOSURE_ID = "A-7";
3 const MAX_CAPACITY = 3;
4
5 // ENCLOSURE_ID = "B-3"; // Błąd! Nie można zmienić wartości stałej
6
7 let currentDinosaurs = 2;
8 currentDinosaurs = 3; // OK - zmienne let mogą zmieniać wartość
9}To jak identyfikatory zagród w parku - raz przypisany numer zagrody (np. "A-7") nie może być zmieniony, aby uniknąć pomyłek i niebezpieczeństwa.
W JavaScript deklaracje zmiennych i funkcji są "wynoszone" (hoisted) na górę ich zakresu. To jak przygotowywanie wszystkich zagród w parku przed przywiezieniem dinozaurów.
Zmienne zadeklarowane za pomocą
var są wynoszone wraz z ich deklaracją, ale bez inicjalizacji:1console.log(dinosaurCount); // undefined - deklaracja jest hoistowana, ale nie inicjalizacja
2var dinosaurCount = 10;Jest to równoważne:
1var dinosaurCount; // Deklaracja jest wyniesiona na górę
2console.log(dinosaurCount); // undefined
3dinosaurCount = 10; // Inicjalizacja pozostaje w oryginalnym miejscuZmienne zadeklarowane za pomocą
let i const również są wynoszone, ale nie są inicjalizowane - próba dostępu do nich przed deklaracją powoduje błąd:1// console.log(dinoSpecies); // Błąd: Cannot access 'dinoSpecies' before initialization
2let dinoSpecies = "Velociraptor";
3
4// console.log(MAX_WEIGHT); // Błąd: Cannot access 'MAX_WEIGHT' before initialization
5const MAX_WEIGHT = 8000;To jak procedura zabezpieczania - zagrody są przygotowane (hoisting), ale nikt nie może do nich wejść (użyć zmiennej), dopóki nie zostaną oficjalnie otwarte (zadeklarowane).
1var securityLevel = "Niski";
2var securityLevel = "Wysoki"; // Dozwolone - nadpisuje poprzednią deklaracjęTo jak przeprowadzanie dinozaura z jednej zagrody do drugiej bez żadnych ograniczeń.
1let carnivoreCount = 5;
2// let carnivoreCount = 7; // Błąd! 'carnivoreCount' zostało już zadeklarowane
3
4const MAX_VISITORS = 150;
5// const MAX_VISITORS = 200; // Błąd! 'MAX_VISITORS' zostało już zadeklarowaneTo jak ścisła kontrola translokacji dinozaurów - nie można przypisać tego samego gatunku do dwóch różnych zagród jednocześnie.
const to najbezpieczniejsza opcja - używaj jej zawsze, gdy wartość zmiennej nie będzie się zmieniać. To jak metalowe ogrodzenia dla drapieżników:1const PARK_NAME = "Jurassic Park";
2const ADMIN_PASSWORD = "clevergirl123";
3const DANGEROUS_SPECIES = ["T-Rex", "Velociraptor", "Dilophosaurus"];Nawet dla obiektów i tablic, których zawartość może się zmieniać, ale referencja pozostaje stała:
1const parkStatus = {
2 isOpen: true,
3 visitorCount: 372
4};
5
6// Dozwolone - zmieniamy właściwość obiektu, nie samą referencję
7parkStatus.visitorCount = 373;
8
9// Błąd! Nie można przypisać nowego obiektu do stałej
10// parkStatus = { isOpen: false, visitorCount: 0 };let to dobry wybór dla zmiennych, których wartość będzie się zmieniać, ale chcemy ograniczyć ich zakres do bieżącego bloku. To jak elastyczne zagrody dla łagodniejszych dinozaurów:1function monitorParkSectors() {
2 for (let i = 0; i < sectors.length; i++) {
3 let currentSector = sectors[i];
4 let dangerLevel = assessDanger(currentSector);
5
6 if (dangerLevel > 7) {
7 let emergencyProtocol = selectProtocol(dangerLevel);
8 activateAlarm(currentSector, emergencyProtocol);
9 }
10 }
11 // Zmienna i, currentSector, dangerLevel, emergencyProtocol nie są już dostępne tutaj
12}Z powodu potencjalnych problemów,
var jest obecnie rzadko zalecane w nowoczesnym JavaScript. Jednak może być przydatne w specyficznych sytuacjach, gdzie potrzebujemy zmienną z zakresem funkcyjnym.1function legacyCode() {
2 if (condition) {
3 var oldSystemVariable = "wartość";
4 }
5
6 // Dostęp do zmiennej poza blokiem, gdzie została zadeklarowana
7 console.log(oldSystemVariable);
8}To jak stare, mniej bezpieczne zagrody w parku - działają, ale lepiej zastąpić je nowocześniejszymi rozwiązaniami.
Zawsze zaczynaj od
const dla swoich zmiennych. Jeśli później okaże się, że potrzebujesz zmienić wartość, zamień na let. To jak zasada w Parku Jurajskim - najpierw zastosuj najsilniejsze zabezpieczenia, a dopiero jeśli okaże się, że potrzebujesz więcej elastyczności, rozważ mniej restrykcyjne opcje.1// Zacznij od const
2const dinoData = fetchDinosaurData();
3
4// Jeśli potrzebujesz modyfikować wartość, użyj let
5let dangerLevel = 0;
6for (const dino of dinoData) {
7 if (dino.aggressive) {
8 dangerLevel++;
9 }
10}W nowoczesnym JavaScript (ES6+) zazwyczaj lepiej jest używać
let i const zamiast var.To pomaga w zrozumieniu, jakie zmienne są używane w danym bloku kodu:
1function processEnclosure(enclosureId) {
2 // Wszystkie deklaracje na początku
3 const enclosure = getEnclosure(enclosureId);
4 let dinosaurCount = enclosure.inhabitants.length;
5 let feedingRequired = false;
6
7 // Logika funkcji poniżej
8 if (timeElapsed > 4) {
9 feedingRequired = true;
10 }
11
12 //
13}Podobnie jak w parku każde pomieszczenie czy procedura ma jasne oznaczenie, tak w kodzie zmienne powinny mieć znaczące nazwy:
1// ŹLE
2const x = 5;
3let y = getZ();
4
5// DOBRZE
6const maxDinosaursPerEnclosure = 5;
7let currentSafetyRating = calculateSafetyScore();TypeScript rozszerza JavaScript o statyczne typowanie, co daje dodatkową warstwę bezpieczeństwa - jak jeszcze solidniejsze ogrodzenia w parku:
1// Definiowanie typów dla lepszego bezpieczeństwa
2let dinoName: string = "Velociraptor";
3const maxSpeed: number = 45;
4const isDangerous: boolean = true;
5
6// Definiowanie typów złożonych
7interface Dinosaur {
8 name: string;
9 species: string;
10 height: number;
11 weight: number;
12 dangerous: boolean;
13}
14
15const trex: Dinosaur = {
16 name: "Rexy",
17 species: "Tyrannosaurus Rex",
18 height: 5.6,
19 weight: 8000,
20 dangerous: true
21};Typy w TypeScript działają jak dodatkowe protokoły bezpieczeństwa - zapobiegają umieszczeniu "roślinożercy w zagrodzie mięsożerców" (przypisaniu wartości niewłaściwego typu).
Poniższy przykład ilustruje prawidłowe użycie
var, let i const w bardziej rozbudowanym scenariuszu:1// Stałe wartości konfiguracyjne - nie zmieniają się
2const PARK_NAME = "Jurassic Park";
3const DANGER_LEVELS = {
4 LOW: 1,
5 MEDIUM: 2,
6 HIGH: 3,
7 CRITICAL: 4
8};
9const DANGEROUS_SPECIES = ["T-Rex", "Velociraptor", "Dilophosaurus"];
10
11// Funkcja monitorująca park
12function monitorPark() {
13 // Stan parku - może się zmieniać
14 let isOpen = true;
15 let visitorCount = getCurrentVisitors();
16 let activeAlerts = [];
17
18 // Przegląd każdego sektora
19 for (let i = 0; i < parkSectors.length; i++) {
20 const sector = parkSectors[i]; // Referencja do sektora nie zmienia się w pętli
21 let sectorStatus = checkSectorStatus(sector);
22
23 // Sprawdź dinozaury w sektorze
24 for (const dinosaur of sector.dinosaurs) {
25 // Species jest stałe - nie zmienia się
26 const species = dinosaur.species;
27
28 // Poziom zagrożenia może się zmieniać
29 let dangerLevel = DANGER_LEVELS.LOW;
30
31 // Ocena zagrożenia
32 if (DANGEROUS_SPECIES.includes(species)) {
33 dangerLevel = DANGER_LEVELS.HIGH;
34
35 // Sprawdź infrastrukturę bezpieczeństwa
36 const fenceStatus = checkFenceStatus(sector.id);
37 const powerStatus = checkPowerStatus(sector.id);
38
39 if (fenceStatus !== "Operational" || powerStatus < 90) {
40 dangerLevel = DANGER_LEVELS.CRITICAL;
41
42 // Lokalny protokół awaryjny
43 let emergencyProtocol = selectEmergencyProtocol(species);
44 activeAlerts.push({
45 sector: sector.id,
46 species: species,
47 protocol: emergencyProtocol
48 });
49
50 // Dodanie alertu może wpłynąć na status parku
51 if (dangerLevel === DANGER_LEVELS.CRITICAL) {
52 isOpen = false;
53 }
54 }
55 }
56 }
57 }
58
59 // Zwróć raport statusu parku
60 return {
61 parkName: PARK_NAME,
62 open: isOpen,
63 visitors: visitorCount,
64 alerts: activeAlerts
65 };
66}var:
let:
const:
Wybór między
var, let i const jest jak wybór odpowiednich zabezpieczeń w Parku Jurajskim - zależy od konkretnych potrzeb, ale zawsze warto zaczynać od najsilniejszych (const) i rozluźniać je tylko wtedy, gdy jest to absolutnie konieczne.W następnej lekcji przyjrzymy się podstawowym typom danych w JavaScript, które są jak różne gatunki dinozaurów w naszym parku - każdy z nich ma swoje unikalne cechy i zastosowania.