Toepassing van Funksie Leksikale Omgewing in JavaScript

Gestel ons het 'n funksie wat 'n ander funksie as sy resultaat teruggee:

javascriptfunction test() {
  return function() {
    
  }
}

As die ouerfunksie enige veranderlikes het, dan sal hierdie veranderlikes in die leksikale omgewing van die teruggekeerde funksie bevat wees:

javascriptfunction test() {
  let num = 1; // veranderlike van die ouerfunksie
  
  return function() {
    // leksikale omgewing = {num: 1}
  }
}

Laat ons console.log in die kode van ons teruggekeerde funksie skryf wat die waarde van die veranderlike num uitdruk:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

Kom ons roep nou die ouerfunksie test en skryf die resultaat van sy werk in die veranderlike func:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

let func = test();

Die teruggekeerde funksie sal in die veranderlike func geskryf word. Kom ons roep ons funksie - dit sal die inhoud van die veranderlike num as sy resultaat uitdruk:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

let func = test();
func(); // sal 1 uitdruk

As ons bloot die veranderlike num buite die funksie probeer uitdruk - sal dit onbeskikbaar wees:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

console.log(num); // veranderlike num is hier onbeskikbaar

Soos jy kan sien, het die plaaslike veranderlike num aan die leksikale omgewing van ons funksie geheg geraak en nou, deur hierdie funksie enige plek in die kode te roep, kan ons die waarde van die veranderlike num kry, selfs al is die veranderlike op die roep-plek op sigself onbeskikbaar.

Trouens, 'n soortgelyke resultaat kan bereik word deur die veranderlike num globaal te maak:

javascriptfunction test() {
  return function() {
    console.log(num);
  }
}

let num = 1; // globale veranderlike
let func = test();
func(); // sal 1 uitdruk

Hier sal daar egter 'n wesenlike verskil wees: in die nuwe weergawe kan die veranderlike num buite funksies verander word (aangesien dit globaal is), maar in die ou weergawe - nie.

Задание 1

Bepaal, sonder om die kode te laat loop, wat in die konsole uitgedruk sal word:

javascriptfunction test() {
  let num1 = 1;
  let num2 = 2;
  
  return function() {
    return num1 + num2;
  }
}

let func = test();
console.log(func());
Задание 2

Bepaal, sonder om die kode te laat loop, wat in die konsole uitgedruk sal word:

javascriptfunction test() {
  let num1 = 1;
  let num2 = 2;
  
  return function() {
    return num1 + num2;
  }
}

console.log(test()());
Задание 3

Bepaal, sonder om die kode te laat loop, wat in die konsole uitgedruk sal word:

javascriptfunction test() {
  let num1 = 1;
  
  return function() {
    return num1 + num2;
  }
}

let num2 = 2;
let func = test();
console.log(func());
Задание 4

Bepaal, sonder om die kode te laat loop, wat in die konsole uitgedruk sal word:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    return num;
  }
}

let num = 2;
let func = test();
console.log(func());