Глобална променлива брояч в 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();