Тағйирёбандаи глобалии ҳисобкунак дар JavaScript
Тағйирёбандаи num-ро берун аз функсияҳо мебарем,
бинобар ин онро глобалӣ месозем:
let num = 1; // тағйирёбандаи глобалӣ
function test() {
return function() {
console.log(num);
num++;
};
}
Дар ин ҳолат, ҳамаи функсияҳои баргардонидашуда ин тағйирёбандаи глобалиро тағйир медиҳанд ва ҳисобкунакҳо аллакай аз ҳам вобаста кор мекунанд:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // ҳисобкунаки якум
func1(); // 1-ро чоп мекунад
func1(); // 2-ро чоп мекунад
let func2 = test(); // ҳисобкунаки дуюм
func2(); // 3-ро чоп мекунад
func2(); // 4-ро чоп мекунад
Чаро рамзи мо пештара ҳисобкунакҳои мустақил месохт? Ин рамзро ба ёд меоварем:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Ҳақиқат он аст, ки тағйирёбандаи num - локалӣ
дар дохили функсияи test мебошад. Аз ин рӯ, ҳар як
фарохонӣ ба test тағйирёбандаи локалии худро ба вучуд меорад.
Аз ин рӯ, функсияҳои баргардонидашуда ба ҳар як
тағйирёбандаи локалии функсияи test ишора мекунанд.
Айнан ҳамин тавр истиқлолият ба даст оварда мешавад.
Агар num-ро тағйирёбандаи глобалӣ созем
- ин ҳам замыкание хоҳад буд. Танҳо муҳити лексикии
функсияҳои баргардонидашуда ба як тағйирёбандаи якхелаи
num ишора мекунад - ҳар гуна
тағйирот дар ин тағйирёбанда дар
ҳамаи функсияҳо намоён хоҳад буд.
Муайян кунед, бидуни оғози код, ки чӣ ба консол бароварда мешавад:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Муайян кунед, бидуни оғози код, ки чӣ ба консол бароварда мешавад:
function test() {
let counter = 0;
return function() {
return function() {
console.log(counter);
counter++;
};
};
}
let func = test()();
let func1 = func;
let func2 = func;
func1();
func2();
func1();
func2();
Муайян кунед, бидуни оғози код, ки чӣ ба консол бароварда мешавад:
function test() {
let counter = 0;
return function() {
return function() {
console.log(counter);
counter++;
};
};
}
let func = test();
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();