Tofauti ya Ulimwengu ya Khesimu katika JavaScript

Tutoee tofauti num nje ya kazi, kwa kufanya hivyo tukifanya iwe ya ulimwengu:

javascriptlet num = 1; // tofauti ya ulimwengu

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

Katika kesi hii kazi zote zitarudi (kubadilisha hii tofauti ya ulimwengu na khesimu (kata kufanya kazi tayari kutegemeana:

javascriptlet num = 1;

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

let func1 = test(); // khesimu ya kwanza
func1();  // itaonyesha 1
func1();  // itaonyesha 2

let func2 = test(); // khesimu ya pili
func2();  // itaonyesha 3
func2();  // itaonyesha 4

Kwa nini msimbo wetu uliopita ulifanya khesimu (zisizotegemeana? Nakukumbusha msimbo huu:

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

Jambo ni kwamba tofauti num - ya ndani ndani ya kazi test. Kwa hivyo kila (wito test huleta tofauti yake ya ndani.

Kwa hivyo kazi zitarudi (rejea kila moja kwa tofauti yake ya ndani ya kazi test. Hivi ndivyo utofauti wa kufanya kazi (unavyopatikana.

Ikiwa tutafanya num kuwa tofauti ya ulimwengu - hii pia itakuwa kufunga. Tu mazingira ya kisarakasi ya kazi zitarudi (rejea kwa tofauti ile ile num - yoyote mabadiliko na tofauti hii yataonekana kwa kazi zote.

Задание 1

Amua, bila kukimbiza msimbo, nini kitaonyeshwa kwenye koni:

javascriptlet counter = 0;
    
function test() {
  return function() {
    console.log(counter);
    counter++;
  };
}

let func = test;

let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Задание 2

Amua, bila kukimbiza msimbo, nini kitaonyeshwa kwenye koni:

javascriptfunction 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();
Задание 3

Amua, bila kukimbiza msimbo, nini kitaonyeshwa kwenye koni:

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