Ֆունկցիաների բառային միջավայրի կիրառությունը JavaScript-ում

Ենթադրենք ունենք ֆունկցիա, որն իր արդյունքում վերադարձնում է մեկ այլ ֆունկցիա.

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

Եթե ծնող ֆունկցիան ունի որևէ փոփոխական, ապա այդ փոփոխականները կպարունակվեն վերադարձվող ֆունկցիայի բառային միջավայրում.

javascriptfunction test() {
  let num = 1; // ծնող ֆունկցիայի փոփոխական
  
  return function() {
    // բառային միջավայր = {num: 1}
  }
}

Գրենք մեր վերադարձվող ֆունկցիայի կոդում console.log, որն արտածում է num փոփոխականի արժեքը.

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

Այժմ եկեք կանչենք ծնող ֆունկցիան test և նրա աշխատանքի արդյունքը գրենք func փոփոխականի մեջ.

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

let func = test();

func փոփոխականի մեջ կգրվի վերադարձվող ֆունկցիան: Եկեք կանչենք մեր ֆունկցիան - իր արդյունքով այն կարտածի num փոփոխականի պարունակությունը.

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

let func = test();
func(); // կարտածի 1

Եթե պարզապես փորձենք արտածել num փոփոխականը ֆունկցիայից դուրս - այն հասանելի չի լինի.

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

console.log(num); // num փոփոխականն այստեղ հասանելի չէ

Ինչպես տեսնում եք, num լոկալ փոփոխականը կապվել է մեր ֆունկցիայի բառային միջավայրին և այժմ, կոդի ցանկացած տեղում կանչելով այս ֆունկցիան, մենք կկարողանանք ստանալ num փոփոխականի արժեքը, նույնիսկ եթե կանչի վայրում ինքնին այդ փոփոխականը հասանելի չէ։

Իրականում, նմանատիպ արդյունքի կարելի է հասնել՝ num փոփոխականը դարձնելով գլոբալ.

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

let num = 1; // գլոբալ փոփոխական
let func = test();
func(); // կարտածի 1

Սակայն, այստեղ կլինի էական տարբերություն. Նոր տարբերակում num փոփոխականը կարելի է փոխել ֆունկցիաներից դուրս (քանի որ այն գլոբալ է), իսկ հին տարբերակում՝ ոչ։

Задание 1

Որոշեք՝ առանց կոդը գործարկելու, թե ինչ կարտածվի կոնսոլում.

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

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

Որոշեք՝ առանց կոդը գործարկելու, թե ինչ կարտածվի կոնսոլում.

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

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

Որոշեք՝ առանց կոդը գործարկելու, թե ինչ կարտածվի կոնսոլում.

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

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

Որոշեք՝ առանց կոդը գործարկելու, թե ինչ կարտածվի կոնսոլում.

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

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