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 ကို ဂလိုဘယ်ကိန်းရှင်အဖြစ် ပြုလုပ်ပါက
- ၎င်းသည်လည်း ပိတ်သောနေရာ (closure) တစ်ခုပင် ဖြစ်ပါသည်။
ပြန်လည်ရရှိသော ဖန်ရှင်များ၏ ဝေါဟာရပတ်ဝန်းကျင်များသည်
num ကိန်းရှင်တစ်ခုတည်းကိုသာ ကိုးကားနေခြင်းဖြစ်ပြီး
ထိုကိန်းရှင်ပြောင်းလဲမှုများကို ဖန်ရှင်အားလုံးတွင် မြင်တွေ့ရမည်
ဖြစ်သည်။
ကုဒ်ကို မစတင်မီ၊ console တွင် အဘယ်အရာကို ပြသမည်ကို သတ်မှတ်ပါ။
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
ကုဒ်ကို မစတင်မီ၊ console တွင် အဘယ်အရာကို ပြသမည်ကို သတ်မှတ်ပါ။
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();
ကုဒ်ကို မစတင်မီ၊ console တွင် အဘယ်အရာကို ပြသမည်ကို သတ်မှတ်ပါ။
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();