Distracție cu ridicarea

În seria TL;DR de astăzi, vom vorbi despre ridicare. Faceți clic aici pentru a afla mai multe despre „seria TL;DR”.

În JavaScript, toate declarațiile de variabile care utilizează var sunt ridicate în partea de sus a domeniului său de aplicare a funcției sau a domeniului global. Iată regulile cheie:

  • Declarațiile de funcție sunt ridicate deasupra declarațiilor de variabile.
  • Expresiile de funcție nu sunt ridicate.
  • Atribuțiile variabile nu sunt ridicate.
  • Variabilele cărora li s-a atribuit o valoare înainte de a fi declarate fac parte automat din domeniul global.
  • Declarațiile sunt găzduite în partea de sus a blocurilor funcționale, nu a blocurilor de cod

Declarațiile de funcție sunt ridicate deasupra declarațiilor de variabile.

După ce are loc ridicarea, arată astfel:

function foo(){};
var foo;
console.log(typeof foo)

Ridicarea mută declarațiile în partea de sus a blocurilor de cod

Rezultatul este nedefinit! Acest lucru se datorează faptului că var x; în blocul if este ridicat în partea de sus a funcției. Atribuirea x=1 este păstrată în blocul if, astfel încât lui x nu i se atribuie niciodată o valoare. După ridicare, codul arată astfel:

function foo(){
    var x;
    if (false){
        x = 1;
    }
    console.log(x);

Amintiți-vă, atribuirea variabilelor nu este ridicată

După ridicare, codul este interpretat astfel:

var foo;
function foo(){};
foo = "abc";

Atribuțiile variabile NU sunt ridicate

După ridicare, codul este interpretat astfel:

var bar;
console.log(bar);
bar = "abc";
console.log(bar);

Expresiile funcției NU sunt ridicate

Atenție la sfera globală

De ce „def”? Să vedem mai întâi ce se întâmplă. Declarația funcției bara este ridicată în partea de sus a fișierului, urmată de var foo. Valoarea lui foo este atribuită „def”, dar când este invocată bar(), valoarea lui foo este atribuită „def”. Deoarece foo nu este declarată local în cadrul funcției bar(), variabila foo de aici este aceeași variabilă foo în domeniul global. Acesta este motivul pentru care „def” este tipărit în consolă.

„utilizare strict”

Declararea „utilizare strictă”; la începutul scriptului nu permite atribuirea de variabile înainte de a începe declarat. Prin utilizarea acestuia, pot fi evitate aceste probleme de ridicare.

Legat de ridicare este noțiunea de domeniul de aplicare a variabilei JavaScript. Cele două sunt legate și, după cum probabil ați observat deja, o neînțelegere despre ridicare și scop poate duce la unele erori foarte urâte. Dar asta e o discuție pentru altă zi!

Îmi place să aud orice feedback sau dacă a fost ceva ce mi-a scăpat. Lasă un comentariu mai jos!