ජාවාස්ක්‍රිප්ට් හි closures භාවිතයෙන් ගණන් කරන්නා

අපි සලකා බැලූ කේතය නැවත ලියමු ආපසු ලබා දෙන ශ්‍රිතය සෑම අවස්ථාවකම num විචල්‍යයේ අගය වැඩි කරයි එකකින්:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++; // එකක් එකතු කරන්න
  }
}

let func = test();

එහි ප්‍රතිඵලයක් ලෙස ශ්‍රිතයේ සෑම කැඳවීමක්ම func කොන්සෝලයේ නව අගයක් ප්‍රදර්ශනය කරයි:

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

let func = test();

func(); //1 ප්‍රදර්ශනය කරයි
func(); //2 ප්‍රදර්ශනය කරයි
func(); //3 ප්‍රදර්ශනය කරයි
func(); //4 ප්‍රදර්ශනය කරයි
func(); //5 ප්‍රදර්ශනය කරයි

එහෙයින්, අපි ශ්‍රිත කැඳවීම් ගණන් කරන්නෙකු ක්‍රියාත්මක කළා closure භාවිතා කිරීම (වඩාත් නිවැරදිව භාවිතා කිරීම විචල්‍යය num අපගේ ශ්‍රිතයේ closure වලින්).

මතක තබා ගන්න, ශ්‍රිතයේ සෑම කැඳවීමක්ම test නව ශ්‍රිතයක් ආපසු ලබා දෙනු ඇත, එයට එහිම closure එකක් ඇත. එනම් විවිධ ගණන් කරන්නන් ස්වාධීනව ක්‍රියා කරනු ඇත:

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

let func1 = test(); // පළමු ගණන් කරන්නා
func1();  //1 ප්‍රදර්ශනය කරයි
func1();  //2 ප්‍රදර්ශනය කරයි

let func2 = test(); // දෙවන ගණන් කරන්නා
func2();  //1 ප්‍රදර්ශනය කරයි
func2();  //2 ප්‍රදර්ශනය කරයි

එහි ප්‍රතිඵලයක් ලෙස එකම විචල්‍යය num විවිධ ශ්‍රිත සඳහා විවිධ අගයන් ඇත!

එනම් අපි ශ්‍රිතය කැඳවන්නේ නම් test වර දෙකක්, එවිට ලබාගත් ශ්‍රිත ස්වාධීන ආකාරයෙන් ක්‍රියා කරනු ඇති අතර ඒ සෑම එකක්ම මෙම ශ්‍රිතවලට තමන්ගේම ස්වාධීන විචල්‍යය num ඇත.

Задание 1

ඔබම, මගේ කේතය බලාගෙන නොසිට, ශ්‍රිත කැඳවීම් ගණන් කරන්නෙකු ක්‍රියාත්මක කරන්න, closures මත වැඩ කරයි.

Задание 2

Closure එකක ශ්‍රිතය අංකය ගබඩා කර තබා ගනිමු 10. ශ්‍රිතයේ සෑම කැඳවීමක්ම එය සිදු වන පරිදි කරන්න මෙම අංකය 1 කින් අඩු කර අඩු කළ අංකය කොන්සෝලයේ දක්වන්න.

Задание 3

පෙර ගැටලුව වෙනස් කරන්න එවිට ගණන් කිරීම 0 දක්වා ළඟා වන අතර ඉන්පසු සෑම පසුකාලීන ශ්‍රිත කැඳවීමක්ම කොන්සෝලයේ දක්වයි ගණන් කිරීම අවසන් වූ බවට පණිවිඩය.