JavaScript функцияларининг лексик муҳитидан фойдаланиш
Фараз қилайлик, бизда натижаси сифатида бошқа функцияни қайтарадиган функция бор:
function test() {
return function() {
}
}
Агар ота-она функциянинг ўзгарувчилари бўлса, у ҳолда бу ўзгарувчилар қайтарилган функциянинг лексик муҳитида сақланади:
function test() {
let num = 1; // ота-она функциянинг ўзгарувчиси
return function() {
// лексик муҳит = {num: 1}
}
}
Кодда бизнинг қайтарилган функциямизга
console.log ни ёзамиз, у
num ўзгарувчисининг қийматини чиқаради:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Келинг энди ота-она функцияни
test чақириб, унинг натижасини
func ўзгарувчисига ёзайлик:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func ўзгарувчисига қайтарилган
функция ёзилади. Келинг бизнинг функцияни чақирайлик - у
ўз натижаси сифатида num ўзгарувчисининг
мўлжалини чиқаради:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // 1 ни чиқаради
Агар num ўзгарувчисини функциядан ташқарида
чиқармоқчи бўлсак, у дастурга ноаник бўлади:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // num ўзгарувчиси бу ерда ноаник
Кўриб турганингиздек, локал num ўзгарувчиси
бизнинг функциямизнинг лексик муҳитига богланди
ва энди, бу функцияни коднинг istalgan joyida чақирсак,
biz num ўзгарувчисининг қийматини ола оламиз,
ҳатто чақириш жойида ўзида бу ўзгарувчи ноаник бўлса-да.
Аслида, шу натижага num ўзгарувчисини
глобал қилиб ҳам эришиш мумкин:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // глобал ўзгарувчи
let func = test();
func(); // 1 ни чиқаради
Бирок, бу ерда мухим тафовут бўлади:
янги вариантда num ўзгарувчисини
функциялардан ташқарида ўзгартириш мумкин
(чунки у глобал), эскисида эса - йўқ.
Кодни ишлатмасдан, консолга нима чиқаришини аниқланг:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Кодни ишлатмасдан, консолга нима чиқаришини аниқланг:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Кодни ишлатмасдан, консолга нима чиқаришини аниқланг:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Кодни ишлатмасдан, консолга нима чиқаришини аниқланг:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());