تێگەیشتن لە Closures

لە زمانی جاڤاسکریپتدا، کلۆژەر (Closure) یەکێکە لە گرنگترین و بەهێزترین چەمکەکان. بە کورتی، کلۆژەر بریتییە لە توانای فەنکشنێک بۆ دەستگەیشتن بەو گۆڕاوانەی کە لە مەودای (Scope) دەرەوەی خۆیدان، تەنانەت دوای ئەوەی ئەو مەودایە کارکردنی تەواو بووە.

تێبینی: هەر کاتێک فەنکشنێک لەناو فەنکشنێکی تردا دروست دەکەیت، فەنکشنە ناوخۆییەکە دەبێتە خاوەنی "کلۆژەر"ێک کە زانیارییەکانی دەوروبەری خۆی لەگەڵ خۆی هەڵدەگرێت.

چۆنیەتی کارکردنی کلۆژەر

کاتێک فەنکشنێک دروست دەکەین، ئەو فەنکشنە "ژینگەی" خۆی لەبیر ناکات. کاتێک فەنکشنێکی ناوخۆیی دەگەڕێنینەوە (return)، ئەو فەنکشنە دەستگەیشتنی بە هەموو ئەو گۆڕاوانە دەبێت کە لە فەنکشنە دەرەکییەکەدا هەبوون.

function createGreeting(message) {
  return function(name) {
    console.log(message + ', ' + name);
  };
}

const sayHello = createGreeting('سڵاو');
sayHello('ئەحمەد'); // دەرەنجام: سڵاو, ئەحمەد

لە نموونەکەی سەرەوەدا، کاتێک createGreeting تەواو بوو، دەبوو گۆڕاوی message لەبیر بکرێت، بەڵام بەهۆی کلۆژەرەوە، sayHello هێشتا دەتوانێت دەستی پێ بگات.

دروستکردنی گۆڕاوی تایبەت (Private Variables)

یەکێک لە بەکارهێنانە سەرەکییەکانی کلۆژەر ئەوەیە کە ڕێگری بکەین لە دەستکاریکردنی گۆڕاوەکان لە دەرەوەی فەنکشنەکە. ئەمە پێی دەوترێت Encapsulation.

function createCounter() {
  let count = 0; // ئەم گۆڕاوە لە دەرەوە نابینرێت
  return {
    increment: function() { count++; console.log(count); },
    decrement: function() { count--; console.log(count); }
  };
}

const myCounter = createCounter();
myCounter.increment(); // 1
myCounter.increment(); // 2
console.log(myCounter.count); // undefined (چونکە تایبەتە)

لێرەدا count پارێزراوە و تەنها لە ڕێگەی فەنکشنەکانی increment و decrement دەتوانرێت دەستکاری بکرێت.

ئاگاداری لە بەکارهێنانی کلۆژەر

ئاگاداری: بەکارهێنانی زۆری کلۆژەر بەبێ پێویست دەبێتە هۆی ئەوەی بیرگە (Memory) بە فیڕۆ بچێت، چونکە گۆڕاوەکان لە بیرگەدا دەمێننەوە و پاک ناکرێنەوە (Garbage Collection ناتوانێت بیانسڕێتەوە).

بەکارهێنانی کلۆژەر لە ناو Loop

یەکێک لە هەڵە باوەکان کاتێکە کە کلۆژەر لەگەڵ var لەناو for loop بەکاردێت. بەکارهێنانی let کێشەکە چارەسەر دەکات چونکە let مەودایەکی تایبەتی بۆ هەر خولێک دروست دەکات.

for (let i = 1; i <= 3; i++) {
  setTimeout(function() {
    console.log('ژمارە: ' + i);
  }, 1000);
}
// دەرەنجام: 1, 2, 3 بەدوای یەکدا

کورتەیەک لەسەر سوودەکانی کلۆژەر

  • پاراستنی داتا و دروستکردنی گۆڕاوی تایبەت.
  • ئاسانکاری لە دروستکردنی فەنکشنەکان (Factory Functions).
  • بەهێزکردنی کۆد لە ڕووی ئەندازیارییەوە.

ئەرکی ماڵەوە (تمرین)

هەوڵ بدە فەنکشنێک دروست بکەیت بە ناوی createBank کە بڕێک پارەی سەرەتایی وەربگرێت (بۆ نموونە 1000). پاشان دوو فەنکشن بگەڕێنێتەوە: یەکێکیان بۆ زیادکردنی پارە (deposit) و ئەوی تریان بۆ کەمکردنەوەی پارە (withdraw). دڵنیابە کە گۆڕاوی پارەکە لە دەرەوە نەبینرێت.