فيه مفاهيم في JavaScript لو فهمتها صح مش بس هتحترف اللغة لأ هتكتب كود أسرع وأكفأ وأكتر احترافية باذن الله.
في المحاضرة دي هنتعلم:
- يعني إيه Scope؟ وإزاي بيتحكم في الوصول للمتغيرات؟
- إيه هو Closure؟ وليه بيعتبر من أقوى مفاهيم JavaScript؟
- إزاي بتؤثر Closures و Scope على الأداء؟ وإزاي تتجنب المشاكل؟
📌 1- يعني إيه Scope في JavaScript؟
Scope هو اللي بيحددلك إيه المتغيرات اللي تقدر توصلها من مكان معين في الكود.
أنواع الـ Scope في JavaScript:
- Global Scope – أي متغير متعرف بره أي دالة، بيبقى متاح في أي مكان في الكود.
- Function Scope – أي متغير جوه فانكشن، مش هتقدر توصله من بره الفانكشن.
- Block Scope (introduced in ES6) – أي متغير متعرف بـ
let
أوconst
جوه{}
مش هيخرج بره. - Lexical Scope – الكود جوه فانكشن بيشوف المتغيرات اللي فوقه في السلسلة، لكن العكس مش صحيح
مثال سريع على Scope:
function testScope() {
let functionVar = “أنا متغير محلي”;
console.log(globalVar); // ✅ يقدر يشوف المتغير الجلوبال
console.log(functionVar); // ✅ متاح جوه الفانكشن
}
testScope();
console.log(globalVar); // ✅ متاح بره الفانكشن
console.log(functionVar); // ❌ خطأ – functionVar غير معرف بره الفانكشن
الفانكشن تقدر توصل للمتغيرات اللي بره لكن الكود الخارجي مش يقدر يوصل لجواها
📌 2- يعني إيه Closures؟
Closure هو لما تكون الفانكشن عندها access للـ Scope اللي اتعرفت فيه حتى بعد تنفيذ الفانكشن الأم
مثال عملي على Closure:
const closureExample = outerFunction(“🔹 قيمة من الخارج”);
closureExample(“✅ قيمة من الداخل”);
// Output:
// Outer: 🔹 قيمة من الخارج, Inner: ✅ قيمة من الداخل
innerFunction
لسه تقدر تشوف outerValue
حتى بعد ما outerFunction
خلص تنفيذها
📌 3- تأثير Closures و Scope على الأداء
🔹 مميزات Closures:
- بتحافظ على القيم حتى بعد انتهاء تنفيذ الفانكشن الأصلية.
- مفيدة جدا في Data Encapsulation (إخفاء البيانات).
- بتستخدم في الـ Callbacks والـ Event Handlers.
🔹 مشاكل الأداء اللي ممكن تحصل:
- استهلاك الذاكرة – لو استخدمت Closures بشكل خاطئ المتغيرات هتفضل محفوظة في الذاكرة بدون داعي.
- Memory Leaks – لو احتفظت بـ References لبيانات مش محتاجها، ده ممكن يسبب تسريبات في الذاكرة.
🔹 تحسين الأداء عند استخدام Closures:
- حاول تفرّغ المتغيرات اللي مش محتاجها بعد الاستخدام.
- تجنب إنشاء Closures بدون داعي داخل الحلقات.
- استخدم
WeakMap
لو بتحتفظ ببيانات مؤقتة.
📌 4- تطبيق عملي – صنع Counter باستخدام Closure
return {
increment: function () {
count++;
console.log(`القيمة الحالية: ${count}`);
},
decrement: function () {
count–;
console.log(`القيمة الحالية: ${count}`);
},
};
}
const counter = createCounter();
counter.increment(); // 🔹 القيمة الحالية: 1
counter.increment(); // 🔹 القيمة الحالية: 2
counter.decrement(); // 🔹 القيمة الحالية: 1
لاحظ إن count
محفوظ داخل Closure ومش يقدر أي حد يوصله مباشرة
🎯 تـــاســك عــمــلــي
🔹 المطلوب:
- اكتب فانكشن
createBankAccount(initialBalance)
ترجع Object فيهdeposit
وwithdraw
. - كل مرة يتم استدعاء
deposit()
يزيد الرصيد، وكل مرةwithdraw()
ينقص. - اتأكد إن الرصيد غير متاح من الخارج مباشرة
📢 متنساش تسيب حلك في الكومنتات
قسم التعليقات