de Bhuvan Malik

Întrebări de interviuri cu funcția de ridicare și ridicare

Intrebari de interviuri cu functia de ridicare si ridicare

Aceasta este partea a 2-a pentru articolul meu anterior despre ridicare, intitulat „Un ghid pentru ridicarea variabilelor JavaScript? cu let și const ”. Deci, asigurați-vă că ați citit acest lucru înainte de a vă scufunda în acesta.

Anterior am vorbit despre ridicarea variabilă doar pentru că funcția de ridicare în JavaScript nu este la fel cu ridicarea variabilă, este unică în felul său. Voi extinde funcția de ridicare a funcției în aceasta, împreună cu câteva întrebări obișnuite și dificile de interviu despre ridicare (variabilă și funcțională) pe care oricine le oferă interviuri JavaScript este aproape sigur să le întâmpine.

Sperăm că, după ce ați terminat aceste 2 părți, veți fi gata să eliminați ridicarea din lista de verificare a pregătirii JavaScript!

Să ajungem la asta.

Funcția de ridicare

Există 2 moduri de a crea funcții în JavaScript, prin Declarația funcției și prin Expresia funcției. Să vedem ce sunt acestea și cum le afectează ridicarea.

Declarația funcției

declarația funcției definește o funcție cu parametrii specificați.
Sintaxă:

function name(param1, param2, ...) {  [statements]}

În JavaScript, declarațiile de funcții ridică definițiile funcției.

Prin urmare, aceste funcții pot fi folosit înainte ca acestea să fie declarate.
Exemplu:

hoisted() // output: "Hoisted"
function hoisted() {  console.log('Hoisted')}

În culise, așa arată interpretul JavaScript la codul de mai sus:

// Hoisted codefunction hoisted() {  console.log('Hoisted')}
// Rest of the codehoisted() // output: "Hoisted"

Acest comportament este adevărat dacă aveți declarații de funcții în Scopul Global sau Scopul funcțional (practic Scopul local în JavaScript).

Acest lucru poate fi util deoarece puteți utiliza logica la nivel superior la începutul codului, făcându-l mai ușor de citit și de înțeles.

Notă: Nu folosiți niciodată declarații funcționale în interiorul blocurilor if / else.

Expresia funcției

function cuvântul cheie poate fi folosit și pentru a defini o funcție în interiorul unei expresii.
Sintaxă:

const myFunction = function [name](param1, param2, ...) {  [statements]}

[name] este opțional, prin urmare acestea pot fi funcții anonime. Putem folosi funcții săgeată la fel:

const myFunction = (param1, param2, ...) => {  [statements]}

Expresiile funcției din JavaScript nu sunt ridicate.

Prin urmare, nu puteți utiliza expresii funcționale înainte de a le defini.
Exemplu:

notHoisted() // TypeError: notHoisted is not a function
const notHoisted = function() {  console.log('foo')}

Acest lucru este tot ce trebuie avut în vedere pentru a crea funcții dintr-un punct de vedere de ridicare.
Acum, la câteva întrebări de interviu!

Întrebări de ridicare a interviului

Ridicarea și comportamentul său neregulat este un subiect fierbinte în timpul interviurilor. Folosind cunoștințele din articolul anterior iar aceasta, se poate naviga prin orice întrebări pe această temă. Acestea fiind spuse, să ne uităm la câteva întrebări frecvente.

Intrebarea 1

var a = 1;
function b() {  a = 10;  return;
  function a() {}}
b();
console.log(a);

Ieșire: 1, Ce?! ?

Acest lucru se datorează faptului că function a() {} statement a creat acum un local a care are un scop funcțional / local. Acest nou a acum este ridicat în partea de sus a funcției sale de închidere b() cu declarația și definiția sa. Iată ce se întâmplă în culise:

var a = 1;
function b() {  // Hoisted  function a() {}
  a = 10;  return;}
b();
console.log(a)

Prin urmare, afirmația a = 10; nu mai schimbă valoarea globalului a care rămâne să fie 1, ci mai degrabă schimbă localul a de la o funcție la o valoare întreagă de 10. Deoarece înregistrăm globalul a, ieșirea este 1.

A avut declarația function a() {} nu a fost acolo, rezultatul ar fi fost de 10.

intrebarea 2

function foo(){    function bar() {        return 3;    }    return bar();    function bar() {        return 8;    }}alert(foo());

Ieșire: 8

Amandoua bar() funcțiile sunt declarații de funcții și, prin urmare, vor fi ridicate în partea de sus a foo() scop local. Însă bar() returnarea 8 va fi ridicată după cea care returnează 3. Prin urmare, cea care returnează 8 va fi executată.

În spatele scenelor:

function foo(){    //Hoisted before    function bar() {        return 3;    }    // Hoisted after    function bar() {        return 8;    }
    return bar();    }alert(foo());

Întrebarea 3

function parent() {    var hoisted = "I'm a variable";    function hoisted() {        return "I'm a function";    }    return hoisted(); }console.log(parent());

Ieșire: „TypeError: ridicat nu este o funcție”

Acesta este complicat. Funcția sa vs. Variabilă! Să o descompunem.

Știm că atunci când vine vorba de ridicarea variabilă, se ridică doar declarația (cu valoarea „nedefinit”), nu definiția!

În cazul declarațiilor de funcții, definițiile sunt, de asemenea, ridicate!

Acum, într-un astfel de caz de declarații multiple (variabilă și funcție în același domeniu) cu același identificator, ridicarea variabilelor este pur și simplu IGNORAT. Interpretul întâlnește declarația funcției și o ridică.
În cele din urmă, declarația de atribuire a variabilelor (care nu a fost ridicată) este executată și „Sunt o variabilă” hoisted, care este o valoare de șir simplă și nu o funcție. De aici eroarea!

Iată culisele acestei probleme:

function parent() {
    // Function declaration hoisted with the definition    function hoisted() {        return "I'm a function";    }
    // Declaration ignored, assignment of a string    hoisted = "I'm a variable"; 
    return hoisted(); 
}console.log(parent());

Întrebarea 4

alert(foo());function foo() {  var bar = function() {    return 3;  };  return bar();  var bar = function() {    return 8;  };}

Ieșire: 3

Acesta este ușor. Functia foo() el însuși va fi ridicat în domeniul de aplicare global ca o declarație de funcție. Cât despre interior foo(), este un caz clar de expresie a funcției atât pentru bar()funcții.

Al doilea bar() interpretul nu va fi citit din timp (fără ridicare). Primul va fi executat și returnat.

Întrebarea 5

var myVar="foo";
(function() {  console.log('Original value was: ' + myVar);  var myVar="bar";  console.log('New value is: ' + myVar);})();

Ieșire: „Valoarea inițială a fost: nedefinită”, „Noua valoare este: bară”

În aceasta, din nou valoarea globală a myVar (‘foo’) este în afara imaginii. Acest lucru se datorează faptului că variabilă myVar este declarat și definit în sfera funcției locale și, prin urmare, este ridicat în partea de sus a IIFE cu o valoare „nedefinit” care este înregistrată mai întâi. Valoarea „bară” este apoi atribuită și înregistrată ulterior.

Aceasta încheie JavaScript Hoisting din partea mea. ?

Speranţă ambii articolele îți sunt de ajutor.

Vă rugăm să consultați articolul de mai jos dacă doriți să aflați funcțiile săgeată și alte funcții ES6 legate de funcții.

Funcții JavaScript ES6: părțile bune
ES6 oferă câteva funcții funcționale noi, care fac programarea în JavaScript mult mai flexibilă. Hai sa vorbim despre…medium.freecodecamp.org

Pace ✌️