JavaScript ရှိ ဂလိုဘယ် ကောင်တာ ကိန်းရှင်

num ကိန်းရှင်ကို ဖန်ရှင်များအပြင်ဘက်သို့ ထုတ်ယူပြီး ၎င်းကို ဂလိုဘယ်အဖြစ် ပြုလုပ်ကြပါစို့။

javascriptlet num = 1; // ဂလိုဘယ် ကိန်းရှင်

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

ဤအခြေအနေတွင် ပြန်လည်ရရှိသော ဖန်ရှင်အားလုံးသည် ဤဂလိုဘယ်ကိန်းရှင်ကို ပြောင်းလဲပစ်မည်ဖြစ်ပြီး ကောင်တာများသည် တစ်ခုနှင့်တစ်ခု မှီခိုနေပါလိမ့်မည်။

javascriptlet num = 1;

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

let func1 = test(); // ပထမ ကောင်တာ
func1();  // 1 ကို ပြသမည်
func1();  // 2 ကို ပြသမည်

let func2 = test(); // ဒုတိယ ကောင်တာ
func2();  // 3 ကို ပြသမည်
func2();  // 4 ကို ပြသမည်

ကျွန်ုပ်တို့ၚ ယခင်ကုဒ်သည် အဘယ်ကြောင့် လွတ်လပ်သော ကောင်တာများ ပြုလုပ်ပေးခဲ့သနည်း။ ဤကုဒ်ကို သတိရပါ။

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

အကြောင်းမှာ num ကိန်းရှင်သည် test ဖန်ရှင် အတွင်းရှိ လိုက်ကယ် ကိန်းရှင် တစ်ခုဖြစ်နေသောကြောင့်ပင်။ ထို့ကြောင့် test ကို ခေါ်ယူသည့်အကြိမ်တိုင်းသည် ၎င်း၏ကိုယ်ပိုင် လိုက်ကယ် ကိန်းရှင်ကို မွေးဖွားပေးပါသည်။

ထို့ကြောင့် ပြန်လည်ရရှိသော ဖန်ရှင်များသည် test ဖန်ရှင်၏ ကိုယ်ပိုင် လိုက်ကယ်ကိန်းရှင်ကို တစ်ခုစီက ကိုးကားပါလိမ့်မည်။ ဤနည်းအတိုင်းပင် လုပ်ဆောင်ချက်၏ လွတ်လပ်မှုကို ရရှိစေပါသည်။

သို့သော် num ကို ဂလိုဘယ်ကိန်းရှင်အဖြစ် ပြုလုပ်ပါက - ၎င်းသည်လည်း ပိတ်သောနေရာ (closure) တစ်ခုပင် ဖြစ်ပါသည်။ ပြန်လည်ရရှိသော ဖန်ရှင်များ၏ ဝေါဟာရပတ်ဝန်းကျင်များသည် num ကိန်းရှင်တစ်ခုတည်းကိုသာ ကိုးကားနေခြင်းဖြစ်ပြီး ထိုကိန်းရှင်ပြောင်းလဲမှုများကို ဖန်ရှင်အားလုံးတွင် မြင်တွေ့ရမည် ဖြစ်သည်။

Задание 1

ကုဒ်ကို မစတင်မီ၊ console တွင် အဘယ်အရာကို ပြသမည်ကို သတ်မှတ်ပါ။

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

ကုဒ်ကို မစတင်မီ၊ console တွင် အဘယ်အရာကို ပြသမည်ကို သတ်မှတ်ပါ။

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

ကုဒ်ကို မစတင်မီ၊ console တွင် အဘယ်အရာကို ပြသမည်ကို သတ်မှတ်ပါ။

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