جافا سكريبت هي لغة قوية ومتعددة الاستخدامات، وأحد أكثر ميزاتها إثارة للاهتمام هو مفهوم الإغلاقات. تعد عمليات الإغلاق أمرًا أساسيًا لفهم كيفية عمل وظائف JavaScript، خاصة فيما يتعلق بالنطاق والوصول المتغير. في هذا البرنامج التعليمي، سنستكشف ماهية عمليات الإغلاق وكيفية عملها ونقدم أمثلة عملية لمساعدتك في إتقان هذا المفهوم.
الإغلاق هو دالة تحتفظ بإمكانية الوصول إلى نطاقها المعجمي، حتى عند تنفيذ الوظيفة خارج هذا النطاق. بعبارات أبسط، يسمح الإغلاق للوظيفة "بتذكر" البيئة التي تم إنشاؤها فيها.
عمليات الإغلاق ضرورية لعدة أسباب:
خصوصية البيانات: تمكنك عمليات الإغلاق من إنشاء متغيرات خاصة لا يمكن الوصول إليها من خارج الوظيفة.
وظائف الحالة: تسمح للوظائف بالحفاظ على الحالة بين المكالمات.
البرمجة الوظيفية: الإغلاقات هي مفهوم أساسي في البرمجة الوظيفية، مما يتيح وظائف ذات ترتيب أعلى والكاريز.
لفهم عمليات الإغلاق، لنبدأ بمثال أساسي:
function outerFunction() { let outerVariable = 'I am outside!'; function innerFunction() { console.log(outerVariable); } return innerFunction; } const myClosure = outerFunction(); myClosure(); // Output: I am outside!
في المثال أعلاه:
الوظيفة الخارجية تنشئ متغيرًا خارجيًا وتحدد الوظيفة الداخلية.
تصل الوظيفة الداخلية إلى المتغير الخارجي، وهو في نطاقه المعجمي.
تقوم الوظيفة الخارجية بإرجاع الوظيفة الداخلية، مما يؤدي إلى إغلاق.
عندما يتم استدعاء myClosure، فإنه لا يزال بإمكانه الوصول إلى المتغير الخارجي على الرغم من انتهاء تنفيذ الوظيفة الخارجية.
1. إنشاء المتغيرات الخاصة
يمكن استخدام عمليات الإغلاق لإنشاء متغيرات خاصة لا يمكن الوصول إليها أو تعديلها إلا من خلال وظائف محددة.
function createCounter() { let count = 0; return { increment: function() { count ; return count; }, decrement: function() { count--; return count; }, getCount: function() { return count; } }; } const counter = createCounter(); console.log(counter.increment()); // 1 console.log(counter.increment()); // 2 console.log(counter.decrement()); // 1 console.log(counter.getCount()); // 1
في هذا المثال، يعد count متغيرًا خاصًا لا يمكن الوصول إليه وتعديله إلا من خلال الأساليب increment وdecrement وgetCount.
2. إنشاء الوظائف ديناميكيًا
تسمح لك عمليات الإغلاق بإنشاء وظائف ديناميكيًا باستخدام بيانات محددة.
function greetingGenerator(greeting) { return function(name) { return `${greeting}, ${name}!`; }; } const sayHello = greetingGenerator('Hello'); const sayGoodbye = greetingGenerator('Goodbye'); console.log(sayHello('Alice')); // Hello, Alice! console.log(sayGoodbye('Bob')); // Goodbye, Bob!
هنا، ينشئ GreetingGenerator إغلاقًا باستخدام متغير الترحيب، مما يسمح لـ sayHello و sayGoodbye باستخدامه عند الاتصال.
3. الحفاظ على الحالة في التعليمات البرمجية غير المتزامنة
تعتبر عمليات الإغلاق مفيدة بشكل خاص في البرمجة غير المتزامنة، حيث تحتاج إلى الحفاظ على الحالة عبر أجزاء مختلفة من التعليمات البرمجية الخاصة بك.
function fetchData(url) { let cache = {}; return function() { if (cache[url]) { return Promise.resolve(cache[url]); } else { return fetch(url) .then(response => response.json()) .then(data => { cache[url] = data; return data; }); } }; } const getUserData = fetchData('https://jsonplaceholder.typicode.com/users/1'); getUserData().then(data => console.log(data)); // Fetches data from the API getUserData().then(data => console.log(data)); // Returns cached data
في هذا المثال، يتم الاحتفاظ بذاكرة التخزين المؤقت عبر استدعاءات متعددة للحصول على بيانات المستخدم، مما يضمن جلب البيانات مرة واحدة فقط لكل عنوان URL وإعادة استخدامها لاحقًا.
تعد عمليات الإغلاق ميزة قوية في JavaScript تسمح للوظائف بالاحتفاظ بالوصول إلى نطاقها المعجمي، حتى عند تنفيذها خارج هذا النطاق. إنها تتيح خصوصية البيانات، والوظائف ذات الحالة، وتشكل حجر الزاوية في البرمجة الوظيفية. من خلال فهم عمليات الإغلاق واستخدامها، يمكنك كتابة تعليمات برمجية JavaScript أكثر كفاءة وقابلية للقراءة وقابلة للصيانة.
قم بتجربة عمليات الإغلاق في مشاريعك، وسوف تقدر قريبًا تنوعها وقوتها. ترميز سعيد!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3