ما فائدة استعمال closure في جافا سكريبت

اقرأ في هذا المقال


في جافا سكريبت، الإغلاق (closure) هو دالة تشير إلى متغيرات في النطاق الخارجي من نطاقها الداخلي، حيث يحافظ الإغلاق على النطاق الخارجي داخل نطاقه الداخلي، ولفهم عمليات الإغلاق، عليك أن تعرف كيف يعمل النطاق المعجمي (lexical scoping) أولاً.

كيفية تحديد النطاق المعجمي Lexical scoping

يحدد النطاق المعجمي نطاق المتغير من خلال موضع ذلك المتغير المعلن في كود المصدر، على سبيل المثال:

let name = ‘John’;

function greeting() {

let message = ‘Hi’;

console.log(message + ‘ ‘+ name);

}

في هذا المثال:

  • اسم المتغير هو متغير عام، يمكن الوصول إليه من أي مكان بما في ذلك وظيفة (() greeting).
  • (message) هي متغير محلي لا يمكن الوصول إليه إلا من خلال دالة (() greeting).

إذا حاولت الوصول إلى متغير (message) خارج وظيفة (() greeting)، فستتلقى خطأ، لذلك يستخدم محرك جافا سكريبت النطاق لإدارة إمكانية الوصول المتغيرة.

كيفية استعمال closure في جافا سكريبت

دعونا نعدل وظيفة (() greeting):

function greeting() {

let message = ‘Hi’;

function sayHi() {

console.log(message);

}

return sayHi;

}

let hi = greeting();

hi(); // still can access the message variable

  • الآن، بدلًا من تنفيذ دالة (()sayHi) داخل دالة (() greeting)، تُرجع دالة (() greeting) كائن دالة (()sayHi)، وخارج دالة (() greeting)، قمنا بتعيين متغير (hi) القيمة التي تم إرجاعها بواسطة دالة (() greeting)، وهي مرجع لوظيفة (()sayHi).
  • ثم قمنا بتنفيذ دالة (()sayHi) باستخدام مرجع تلك الوظيفة: (()hi)، إذا قمت بتشغيل الكود، فستحصل على نفس التأثير كما هو مذكور أعلاه، ومع ذلك، فإن النقطة المهمة هنا هي أنه عادةً يوجد متغير محلي فقط أثناء تنفيذ الوظيفة، هذا يعني أنه عند اكتمال تنفيذ وظيفة (() greeting)، لم يعد متغير (message) متاحًا.
  • في هذه الحالة، نقوم بتنفيذ الدالة (()hi) التي تشير إلى وظيفة (()sayHi)، ولا يزال متغير (message) موجودًا، رائع هذا هو الإغلاق، بمعنى آخر، وظيفة (()sayHi) هي إغلاق، فالإغلاق هو وظيفة تحافظ على النطاق الخارجي في نطاقها الداخلي.

شارك المقالة: