Új
Home » A JS rejtelmei amikkel érdemes tisztában lenni: scope, closure és hoisting

A JS rejtelmei amikkel érdemes tisztában lenni: scope, closure és hoisting

Az olyan alapfogalmak, mint a scope (hatókör), a closure (lezárás) és a hoisting (emelés), kulcsfontosságúak ahhoz, hogy hatékonyan és hibamentesen dolgozhassunk. Ezek a koncepciók meghatározzák, hogy a változók és függvények hol és hogyan érhetők el, hogyan viselkednek a különböző hatókörökben, és miként kezelik a JavaScript belső mechanizmusai a kódunkat. Ebben a cikkben röviden bemutatjuk ezeket a fogalmakat, hogy még tisztább képet kapj róluk.

Scope(hatókör)

A scope (hatókör) JavaScriptben azt határozza meg, hogy a változók, függvények és objektumok hol érhetők el a kódban, és hol használhatók. A scope segít elkerülni a változók közötti konfliktusokat és szabályozza az adatokhoz való hozzáférést.

1. Globális hatókör (Global Scope)

Azok a változók, amelyek a kód legfelső szintjén vannak definiálva (nem egy függvény vagy blokk belsejében), globális hatókörrel rendelkeznek. Ezek a változók bárhonnan elérhetők a programban:

let globalVar = "Ez globális változó";

function printGlobalVar() {
  console.log(globalVar); // Hozzáfér a globális változóhoz
}

printGlobalVar(); // "Ez globális változó"

2. Függvény hatókör (Function Scope)

Egy függvényen belül definiált változók csak azon belül érhetők el, ahol deklarálták őket. A függvényen kívül ezek a változók nem hozzáférhetők:

function myFunction() {
  let localVar = "Ez lokális változó"; // Lokális változó
  console.log(localVar);
}

myFunction(); // "Ez lokális változó"
console.log(localVar); // Hiba: localVar is not defined

3. Blokk hatókör (Block Scope)

A let és const kulcsszavakkal deklarált változók blokkszintű hatókörrel rendelkeznek. Egy blokk a {} közé zárt kódrészlet. A blokk hatókörű változók csak azon a blokkon belül érhetők el, ahol deklarálták őket:

{
  let blockScoped = "Blokk hatókörű változó";
  console.log(blockScoped); // "Blokk hatókörű változó"
}
console.log(blockScoped); // Hiba: blockScoped is not defined

4. Lexikális hatókör (Lexical Scope)

A belső függvények hozzáférhetnek a külső függvény hatóköréhez, de fordítva nem. A JavaScript statikus vagy lexikális hatókörű nyelv, tehát a változók elérhetősége a kód írásának helyétől függ, nem a futás közbeni környezettől:

function outerFunction() {
  let outerVar = "Külső változó";

  function innerFunction() {
    console.log(outerVar); // Hozzáfér a külső változóhoz
  }

  innerFunction();
}

outerFunction(); // "Külső változó"

Példa a különböző hatókörök kombinációjára

let globalVar = "Globális";

function outerFunction() {
  let outerVar = "Függvény hatókör";

  {
    let blockVar = "Blokk hatókör";
    console.log(globalVar); // Globális
    console.log(outerVar);  // Függvény hatókör
    console.log(blockVar);  // Blokk hatókör
  }

  // console.log(blockVar); // Hiba: blockVar is not defined
}

outerFunction();

Closure(lezárás)

A closure (lezárás) a JavaScript egyik erőteljes koncepciója, amely akkor jön létre, amikor egy belső függvény hozzáfér a külső függvény változóihoz, még akkor is, ha a külső függvény már végrehajtódott. Ez azért lehetséges, mert a belső függvény megőrzi a környezetét, amelyben létrejött.

A belső függvény „lezárja” a külső függvény hatókörét, így hozzáférést nyer annak változóihoz, még a külső függvény lefutása után is:

function makeCounter() {
  let count = 0; // Ez a változó a closure része lesz

  return function () {
    count++; // Hozzáfér a külső függvény változójához
    return count;
  };
}

const counter1 = makeCounter(); // Létrehoz egy új closure-t
console.log(counter1()); // 1
console.log(counter1()); // 2
console.log(counter1()); // 3

const counter2 = makeCounter(); // Egy másik closure-t hozunk létre
console.log(counter2()); // 1 (mivel külön hatókörben van)
console.log(counter1()); // 4 (az első closure saját állapotát tartja fenn)

Hoisting(emelés)

A hoisting (emelés) egy JavaScript viselkedés, amelyben a változók és függvénydeklarációk „felkerülnek” a hatókörük tetejére a kód végrehajtása előtt. Ez azt jelenti, hogy a változókat és függvényeket már azelőtt elérhetjük, hogy a kódban ténylegesen definiálnánk őket.

1. Változók hoistingja

A változók deklarációja (csak a deklaráció!) felkerül a hatókör tetejére. Az értékadás viszont a helyén marad. Ha egy var-ral deklarált változót használunk a deklaráció előtt, az értéke undefined lesz:

console.log(a); // undefined (hoisting miatt létezik, de még nem kapott értéket)
var a = 5;
console.log(a); // 5

2. let és const hoistingja

A let és const változók szintén hoisting alá esnek, de az ún. „Temporal Dead Zone” (TDZ) miatt nem érhetők el a deklarációjuk előtt:

console.log(b); // Hiba: Cannot access 'b' before initialization
let b = 10;

const c = 20;
console.log(c); // 20

3. Függvények hoistingja

A függvénydeklarációk teljes egészében „felkerülnek” a hatókör tetejére, így a függvényt a deklaráció előtt is meghívhatjuk:

sayHello(); // "Hello, world!" (hoisting miatt működik)

function sayHello() {
  console.log("Hello, world!");
}

Viszont a függvénykifejezések (pl. var, let vagy const változókhoz rendelt függvények) másképp viselkednek, mert ezeknél csak a változó deklarációja kerül „fel”, de maga a függvénykifejezés nem:

sayHi(); // Hiba: sayHi is not a function
var sayHi = function() {
  console.log("Hi!");
};

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

We use cookies to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners. View more
Cookies settings
Accept
Privacy & Cookie policy
Privacy & Cookies policy
Cookie name Active

Kik vagyunk

Javasolt szöveg: A weboldalunk címe: https://blog.solutionmaster.hu.

Hozzászólások

Javasolt szöveg: Hozzászólás beküldésekor a hozzászólási űrlapban megadottakon kívül begyűjtésre kerül a hozzászóló IP címe és a böngészőazonosító karakterlánc a kéretlen tartalmak kiszűrése céljából.

Egy személytelenített, az e-mail címből előállított karakterlánc (hashnek szokás nevezni) kerül továbbításra a Gravatar szolgáltatás felé, ha ez az oldalon használatban van. A Gravatar szolgáltatás feltételei az alábbi címen tekinthetőek meg: https://automattic.com/privacy/. A hozzászólás elfogadása után, a hozzászólásunk tartalma és a profil képünk is megjelenik nyilvánosan.

Média

Javasolt szöveg: Amennyiben regisztrált felhasználó által kerül kép feltöltésre a honlapra, kerülni kell az az olyan EXIF-eket, amelyekben GPS pozíció adatok is szerepelnek. A honlap látogatói ezeket letölthetik és kinyerhetik a helyadatokat a honlapon található képekből.

Sütik

Javasolt szöveg: Ha hozzászólást írunk a honlapon, a megadott nevet, e-mail és honlap címet sütikben eltároljuk. A tárolás a kényelmi célokat szolgál azért, így a következő hozzászóláskor ezeket a mező adatokat nem kell kitölteni. A sütik lejárati ideje egy év.

Ha ellátogatunk a bejelentkezési oldalra, akkor átmeneti sütiket állítunk be annak érdekében, hogy megállapítsuk, hogy a böngésző elfogadja-e a sütiket. Ezek a sütik nem tartalmaznak személyes információt, és törlődnek, ahogy bezárjuk a böngészőt.

A honlapra történő bejelentkezéskor több sütit hozunk létre, amely elmenti a bejelentkezési információt és a szerkesztőfelület megjelenítési opcióit. A bejelentkezési sütik két napig érvényesek, a szerkesztőfelület képernyő opcióit tároló süti egy évig. Amennyiben az "Emlékezz rám" opciót bejelöljük, a bejelentkezés két hétig folytatódik. Kijelentkezéskor a bejelentkezési sütik eltávolításra kerülnek.

Amennyiben bejegyzést vagy oldalt szerkesztünk, egy újabb sütit tárol el a böngészőnk. Ez a süti nem tartalmaz személyes adatot, egyszerűen csak a bejegyzés azonosító számát tárolja, amelyet szerkesztettünk. Egy nap múlva jár le az érvényessége.

Más honlapokról származó beágyazott tartalmak

Javasolt szöveg: A honlapon elérhető bejegyzések külső forrásból származó beágyazott tartalmakat (pl. videók, képek, cikkek stb.) használhatnak. A külső forrásból származó beágyazott tartalmak pontosan úgy viselkednek, mintha meglátogattunk volna egy másik honlapot.

Ezek a webhelyek lehetséges, hogy adatot gyűjtenek a látogatókról, sütiket vagy harmadik féltől származó követőkódot használnak, figyelik a beágyazott tartalommal kapcsolatos felhasználói viselkedést, ha rendelkezünk felhasználói fiókkal és be vagyunk jelentkezve az oldalra.

Kivel osztjuk meg a felhasználói adatokat

Javasolt szöveg: Ha jelszó visszaállítást kér, akkor az IP-címet a visszaállító e-mail tartalmazni fogja.

Mennyi ideig őrizzük a személyes adatot

Javasolt szöveg: Ha hozzászólunk, a hozzászólás és annak metaadatai nem meghatározható ideig a rendszerben maradnak. Ennek célja, hogy az összes ezt követő bármely hozzászólás általunk megismertté és jóváhagyottá váljon, azaz ne kerüljön fel a moderálandó hozzászólások listájára.

A honlapon regisztrált felhasználók (ha vannak ilyenek) személyes adatai a saját felhasználói profiljukban is tárolásra kerülnek. Minden felhasználó megtekintheti, szerkesztheti vagy törölheti a személyes adatait bármikor (kivéve, hogy nem változtathatja meg a saját felhasználónevét). A honlap rendszergazdái ezen információkat szintén megtekinthetik és szerkeszthetik.

Milyen jogokkal rendelkezik a felhasználó a saját adatai kapcsán

Javasolt szöveg: A weboldalon regisztrált fiók vagy hozzászólás írása esetén kérhető a személyes adatok export fájlban történő megküldése, amely bármilyen adatot tartalmaz, amit korábban a felhasználó rendelkezésünkre bocsátott. Kérhető továbbá, hogy bármilyen korábban megadott személyes adatot töröljük. Ez nem vonatkozik azokra az adatokra, amelyeket adminisztrációs, jogi vagy biztonsági okokból kötelező megőriznünk.

Hová kerülnek továbbküldésre az adatok

Javasolt szöveg: A látogatók által beküldött hozzászólásokat automatikus spamszűrő szolgáltatás ellenőrizheti.

Save settings
Cookies settings