Learning
JavaScript

Tipikus hibák és best practice-ek

Gyakori JavaScript hibák (var, this, referencia vs érték, == vs ===, typeof null) és tiszta kód irányelvek összefoglalva.

Tipikus hibák és best practice-ek

Ez az oldal a teljes jegyzet 17–19. fejezetének kivonata: klasszikus JS csapdák és tiszta kód minták.
Forrás: content/javascript/javascript-full.mdx.


1. Klasszikus hibák

var ciklusban

// Probléma
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // 3, 3, 3
}

// Megoldás – let
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // 0, 1, 2
}

Ok: var function scope‑ú, a setTimeout callback mind ugyanazt az i‑t látja.
Tanulság: használj let/const‑ot, ne var‑t.


this félreértése

// Problémás minta
const user = {
  nev: "Adam",
  udvozol() {
    setTimeout(function() {
      console.log(this.nev); // undefined
    }, 100);
  }
};

// Megoldás – arrow function, ami a külső this-t örökli
const user2 = {
  nev: "Adam",
  udvozol() {
    setTimeout(() => {
      console.log(this.nev); // "Adam"
    }, 100);
  }
};

Szabály: object metódushoz normál function, belső callbackhez gyakran arrow function.


Kezeletlen Promise hibák

// Problémás – a hiba "elszáll"
async function leker() {
  return adatok; // ha itt hiba van, nem kezeled
}

leker(); // se .catch, se try/catch

Megoldás .catch‑sel:

leker().catch(hiba => console.error(hiba));

Vagy async/await + try/catch:

async function futo() {
  try {
    await leker();
  } catch (hiba) {
    console.error(hiba);
  }
}

Reference vs value félreértése

// Probléma
const eredeti = { nev: "Adam" };
const masolat = eredeti; // ugyanaz az object
masolat.nev = "Peter";

console.log(eredeti.nev); // "Peter"

Helyes shallow copy:

const helyesMasolat = { ...eredeti };
helyesMasolat.nev = "Peter";

console.log(eredeti.nev); // "Adam"

== vs ===

// Meglepetés
0 == false;     // true
"" == false;    // true
null == undefined; // true

if (0 == false) {
  console.log("Egyenlő!"); // lefut
}

// Biztonságosabb
0 === false; // false

Irányelv: mindig === / !== összehasonlítókat használd.


typeof null === "object"

typeof null; // "object" – ismert, történelmi bug

// Helyes ellenőrzés:
ertek === null;      // csak null
ertek == null;       // null vagy undefined (la za, de szándékos)

2. Tiszta kód irányelvek

Érthető nevek

// Rossz
const x = 86400;
const fn = (a, b) => a + b;

// Jó
const MASODPERCEK_NAPBAN = 86400;
const osszead = (a, b) => a + b;

Használj döbbenet nélkül olvasható neveket – 6 hónap múlva is érthető legyen.


Kis, jól fókuszált függvények

// Rossz – túl sok felelősség
function felhasznaloKezel(id) {
  // letölt, validál, megjelenít, logol stb.
}

// Jobb – egy felelősség / függvény
async function felhasznaloLetolt(id) { /* ... */ }
function felhasznaloValidal(user) { /* ... */ }
function felhasznaloMegjelenit(user) { /* ... */ }

const alapból

// Ami nem változik, az legyen const
const MAX_UJRAPROBALAS = 3;
const felhasznalo = { nev: "Adam" };

// Ami tényleg változik, az let
let szamlalo = 0;

Ez segít véletlen módosítások elkerülésében, és explicit jelez, mi az "állandó".


Kerüld a "mágikus számokat"

// Rossz
if (kor > 17) {
  // ...
}

// Jó
const FELNOTT_KOR = 18;
if (kor >= FELNOTT_KOR) {
  // ...
}

Ha egy szám / string üzleti szabályt fejez ki, adj neki nevet.


Early return – lapos logika

// Rossz – mély beágyazás
function feldolgoz(user) {
  if (user) {
    if (user.aktiv) {
      if (user.email) {
        // logika
      }
    }
  }
}

// Jobb – korai kilépés
function feldolgoz(user) {
  if (!user) return;
  if (!user.aktiv) return;
  if (!user.email) return;

  // tényleges logika – lapos struktúra
}

3. Összefoglaló táblázatok

Kritikus fogalmak röviden

FogalomRövid magyarázatMikor fontos?
HoistingDeklarációk a scope tetejére kerülnekvar, function declaration
ClosureBelső függvény megőrzi a külső scope‑otállapot, adatrejtés
ScopeHol látható egy változóminden változó deklarációnál
PrototypeJS öröklődési modellclass, OOP
Event LoopAszinkron kód ütemezése (stack, queue‑k)async kód, teljesítmény
PromiseAszinkron érték ígéretehálózati kérések, async flow
async/awaitPromise‑okra épülő szinkron‑szerű szintaxismodern async kód

Primitive vs reference – gyors összevetés

PrimitiveReference
Típusokstring, number, boolean, null, undefined, symbol, bigintobject, array, function
Tárolásértékreferencia (memóriacím)
Másolásúj érték, függetlenúj referencia ugyanarra az objektumra
Módosításimmutable (új érték lesz)mutable (belső állapot változhat)

Zárás

  • A legtöbb "furcsa" JS hiba 4 forrásra vezethető vissza:
    1. var + scope / hoisting,
    2. this félreértése,
    3. referencia vs érték keverése,
    4. aszinkron kód (Promise / event loop) félreértése.
  • Ha ezeket a mintákat tudatosan kerülöd, és a best practice‑eket követed, a JS kódod jóval kiszámíthatóbb és olvashatóbb lesz.

További részletekhez és teljes példákhoz:
content/javascript/javascript-full.mdx

On this page