Sobes.tech
Junior

Шта је опсег у JavaScript-у?

sobes.tech АИ

Одговор од АИ

Opseg (Scope) u JavaScript-u je kontekst u kojem su definisane i dostupne promenljive i funkcije.

Jednostavno rečeno, određuje gde u kodu se može referisati na promenljivu ili funkciju.

Postoji nekoliko tipova opsega:

  • Globalni opseg (Global Scope): Promenljive deklarisane van bilo koje funkcije nalaze se u globalnom opsegu. One su dostupne sa bilo kog mesta u kodu.
    // Globalna promenljiva
    let globalVar = "Vidljiv sam svuda";
    
    function showGlobal() {
      console.log(globalVar); // Dostupno unutar funkcije
    }
    
    showGlobal();
    
  • Lokalni (funkcijski) opseg (Local/Function Scope): Promenljive deklarisane unutar funkcije su u lokalnom opsegu te funkcije. One su dostupne samo unutar te funkcije i u ugnježdenim funkcijama, ali ne i spolja.
    function showLocal() {
      // Lokalna promenljiva
      let localVar = "Vidim samo ovde";
      console.log(localVar);
    }
    
    showLocal();
    // console.log(localVar); // Greška: localVar nije definisana
    
  • Blok opseg (Block Scope): Uveden u ES6 (ES2015) sa let i const. Promenljive deklarisane sa let ili const unutar uglastih zagrada ({}), na primer u blokovima koda, petljama ili uslovima, imaju blok opseg. Promenljive deklarisane sa var nemaju blok opseg.
    if (true) {
      // Promenljiva sa blok opsegom
      let blockVar = "Vidljiva samo u ovom bloku";
      console.log(blockVar);
    }
    
    // console.log(blockVar); // Greška: blockVar nije definisana
    
    for (let i = 0; i < 2; i++) {
      // Promenljiva sa blok opsegom u petlji
      console.log(i);
    }
    
    // console.log(i); // Greška: i nije definisana (ako je korišćen let)
    

Takođe je važno razumeti koncept niza opsega (Scope Chain). Kada JavaScript pokušava da pronađe vrednost promenljive, prvo traži u trenutnom opsegu. Ako je ne pronađe, prelazi u spoljašnji (roditeljski) opseg i tako dalje, sve do globalnog opsega. Ako promenljiva nije pronađena nigde, izaziva grešku ReferenceError.