# Nuance global variable of counter in JavaScript

Let's take the variable `num` out of functions, thereby making it global:

`let num = 1; // the global variable function test() { return function() { console.log(num); num++; }; };`

In this case, all returned functions will change this global variable and the counters will work already depending on each other:

`let num = 1; function test() { return function() { console.log(num); num++; }; }; let func1 = test(); // the first counter func1(); //shows 1 func1(); //shows 2 let func2 = test(); // the second counter func2(); //shows 3 func2(); //shows 4`

Why did our previous code make independent counters? Recall this code:

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

The point is that the variable `num` is local inside the function `test`. Therefore, each call to `test` generates its own local variable.

Therefore, the each of returned functions will refer to its local function variable `test`. This is how independence is achieved.

If we make `num` a global variable, this will also be a closure. It's just that the lexical environments of returned functions refer to the same variable `num` - any changes to this variable will be visible in all functions.

Determine what will be output to the console without running the code:

`let counter = 0; function test() { return function() { console.log(counter); counter++; }; }; let func = test; let func1 = func(); let func2 = func(); func1(); func2(); func1(); func2();`

Determine what will be output to the console without running the code:

`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();`

Determine what will be output to the console without running the code:

`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();`
←→
↑
en ru