Kezdőoldal » Számítástechnika » Weblapkészítés » Valaki ezt el tudná magyarázni?

Valaki ezt el tudná magyarázni?

Figyelt kérdés

Van egy YouTube csatorna, ami különböző CSS-es és JS-es megoldásokat és ötleteket mutat be (illetve több ilyen is van, de én csak ezt az egyet nézem :D), és azt mondta a srác, hogy JS-ben ne használjunk 'var'-t, csakis 'let'-et és konstansokat.

Valaki elmondaná, hogy miért?

Illetve mi ez a let? Még sosem hallottam róla. Olyasmi, mint a var?



2020. ápr. 20. 12:40
 1/5 anonim ***** válasza:
68%
Annyira én sem értek hozzá, de az is egyfajta változó-deklarálás. Mármint érted: let=legyen
2020. ápr. 20. 12:57
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:
100%

A var érvényességi tartománya funkción belüli, míg a let scope-ja blokkon belüli. A let (és a const) egy viszonylag új dolog, az ES2015-ben lett deklarálva, azért nem hallottál róla. Előtte JS-ben nem volt lehetőség blokk-szintű változó definiálására.


A var-féle deklarációval csak az gond, hogy nehezebben átlátható, hol érvényes és hol nem. Nézd az alábbi példát:


function printMatrix (matrix) {

for (var i = 0; i < matrix.length; i++) {

var line = matrix[i];

for (var i = 0; i < line.length; i++) {

var element = line[i];

console.log(element);

}

}

}


var matrix = [

[1, 2, 3],

[4, 5, 6],

[7, 8, 9]

];


printMatrix(matrix);


Amikor meglátod ezt a kódrészletet, az hihetnéd, hogy van két egymásba ágyazott ciklusod, amikor soronként és oszloponként végigiterálnak a mátrixban, és kiírják a tartalmát. Ehelyett az történik, hogy a külső ciklusban definiált i változót a belső ciklusban lazán felülírod, merthogy a függvény-szintű scope miatt a két i változó gyakorlatilag ugyanaz. Így a függvény eredmény, ha meghívod a mátrixra, ez lesz:

1

2

3


Viszont ha átírod a var-t let-re, akkor már a várt kimenetet kapod.

2020. ápr. 20. 13:12
Hasznos számodra ez a válasz?
 3/5 anonim ***** válasza:
100%

"Imádom" az ilyen webes "tutorialokat". "Csináld így, mer én aszondom." Minimálisnál is kevesebb magyarázat, nehogy még az ember mélyebben is megértse. Aztán mond egy mindenféle indoklás nélküli véleményt, hogy ezt csináld, azt meg ne, "mer én aszondom". Aztán vagy igaza van, vagy nincs. De egy biztos: a néző az okot nem fogja megtudni.


Egyébként meg: hülyeség. A var és a let között két lényeges különbség van. 1.: a var a teljes függvényben él, amiben létrehozták, míg a let csak az aktuális blokkban. Normális körülmények között, egy kicsit is átgondoltan felépített programban nem fog a kettő közötti különbség kiütközni. Oké, ebben megoszlanak a vélemények, de én a klasszikus irányelvet szoktam követni: a változókat mindig a függvény elején hozom létre, így könnyen átlátom, hogy milyen változóim vannak. Az, hogy ott deklarálom a változót, ahol épp eszembe jut használni, az lehet, hogy kényelmes, de az első lépés a spagetti-kód felé. De ha már blokkon belül deklarálom, akkor miért szűnjön meg a blokk végeztével? Szintén spagetti-kód az, ahol baj, ha egy változó az egész függvényben él. Meg az is eléggé "furcsa", ha "csak úgy" blokkba teszünk pár utasítást. Oké, talán lehet létjogosultsága, mondjuk egy if-nél, ahol az elágazáson belül jön létre a változó, és utánna meg is szűnik... de ha nem selejtes a programozó, akkor szemernyi gondot sem okoz egy már létező, a függvény elején deklarált változót használni. Csak mondjuk a blokk elején le kell nullázni az értékét. De ez meg alap lenne...

2. A let nem engedi meg az újradefiniálást. Var-ral egymás után kétszer "létrehozhatjuk" ugyanazt a változót. Let-tel nem.

2020. ápr. 20. 13:12
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:
100%

1. A fő különbség a változó deklarálásának hatókörében keresendő. A var - attól függően, hogy globálisan (a függvényen kívül) vagy lokálisan (a függvényen belül) deklarálod - globális/lokális hatókörű. A let meg "szigorúbb", blokkszintű (szóval egy cikluson, feltételen, stb... belülre korlátozódik) - de úgyanúgy használható lokális/globális változóként is.


Szóval var esetén:

var sum = 0;

for (var i = 0; i < 10; i++) {

sum += i;

}

console.log(i); // Itt 10 lesz a konzolon


let esetén

let sum = 0;

for (let j = 0; j < 10; j++) {

sum += j;

}

console.log(j); // Itt meg dob egy "ReferenceError: j is not defined" hibát


2. A let-tet nem lehet újradeklarálni.

Szóval ez megengedett:

var adat = 10;

var adat = 20;

console.log(adat);


ez nem:

let masikAdat = 30;

let masikAdat = 40;


3. A var kulcsszóval deklarált változó a deklaráció előtt már rendelkezik egy "undefined" (meghatározatlan) értékkel (ezt nevezik "hoisting"-nek):

console.log(foo); // undefined

var foo = "Foo";

console.log(foo); // Foo


a let meg nem:

console.log(bar); // ReferenceError

let bar = "Bar";

console.log(bar); // Bar

2020. ápr. 20. 13:27
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:
Köszönöm a válaszokat, már amelyik igazán válasz volt.
2020. ápr. 20. 13:52

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!