المتغيرات الخاصة باستخدام الإغلاقات
أخفوا الحالة ضمن نطاق دالة.
المتغيرات الخاصة باستخدام الإغلاقات درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
الخصوصية عبر الإغلاقات
افتقرت JavaScript طويلًا إلى طريقة مدمجة لجعل حقول الكائنات خاصة. توفر الإغلاقات هذه الطريقة: فالمتغيرات داخل الدالة غير مرئية من خارجها، لكنها تظل متاحة للدوال المعرّفة بداخلها.
function secretBox() {
let secret = "hidden";
return {
reveal: () => secret
};
}
const box = secretBox();
console.log(box.reveal()); // "hidden"
console.log(box.secret); // undefinedعداد بحالة خاصة
المثال النموذجي هو عداد لا يمكن العبث بعدّه مباشرةً. ولا يمكن تغييره إلا بواسطة الطرائق المُعادة.
function makeCounter() {
let count = 0;
return {
increment: () => ++count,
value: () => count
};
}
const c = makeCounter();
c.increment();
c.increment();
console.log(c.value()); // 2الحالة بمنأى عن العبث
لا توجد طريقة للوصول إلى count من الخارج. تؤدي محاولات قراءته إلى إرجاع undefined؛ لذا يجب المرور عبر الطرائق.
function makeCounter() {
let count = 0;
return { inc: () => ++count, get: () => count };
}
const c = makeCounter();
c.count = 100; // creates an unrelated property
console.log(c.get()); // 0 - real count untouchedفرض القواعد
بما أن الوصول يمر عبر الطرائق، يمكنكم فرض الثوابت، مثل عدم السماح مطلقًا بأن يصبح الرصيد سالبًا.
function account(start) {
let balance = start;
return {
withdraw: (n) => {
if (n > balance) return "insufficient";
balance -= n;
return balance;
},
balance: () => balance
};
}
const a = account(100);
console.log(a.withdraw(150)); // "insufficient"
console.log(a.withdraw(40)); // 60حقول خاصة متعددة
يمكن للإغلاق حماية عدة متغيرات في الوقت نفسه. تكون جميعها مخفية، ولا تتشاركها إلا الطرائق المُعادة.
function user(name) {
let logins = 0;
let lastSeen = null;
return {
login: () => { logins++; lastSeen = "now"; },
stats: () => ({ name, logins, lastSeen })
};
}
const u = user("Ada");
u.login();
console.log(u.stats()); // { name: "Ada", logins: 1, lastSeen: "now" }دوال مساعدة خاصة
لا يقتصر الأمر على البيانات؛ يمكنكم إخفاء الدوال الداخلية أيضًا. فالطرائق التي تعرضونها فقط تكون عامة.
function temperature() {
let celsius = 0;
const toF = (c) => c * 9 / 5 + 32; // private
return {
set: (c) => { celsius = c; },
fahrenheit: () => toF(celsius)
};
}
const t = temperature();
t.set(100);
console.log(t.fahrenheit()); // 212مثيلات مستقلة
ينشئ كل استدعاء للمصنع حالة خاصة منفصلة، لذلك لا تتداخل المثيلات مع بعضها مطلقًا.
function makeCounter() {
let n = 0;
return { inc: () => ++n };
}
const a = makeCounter();
const b = makeCounter();
console.log(a.inc(), a.inc()); // 1 2
console.log(b.inc()); // 1إتاحة للقراءة فقط
اعرضوا دالة جلب من دون دالة ضبط لجعل القيمة للقراءة فقط من الخارج، مع بقائها قابلة للتعديل داخليًا.
function timer() {
let ticks = 0;
setupInternally();
function setupInternally() { ticks = 3; }
return { ticks: () => ticks };
}
const t = timer();
console.log(t.ticks()); // 3 - no way to set it outsideمقارنة: حقول الفئات
تدعم JavaScript الحديثة أيضًا حقول الفئات الخاصة #private. وتظل الإغلاقات مفيدة لدوال المصنع، وعندما تريدون الخصوصية من دون استخدام الفئات.
class Counter {
#count = 0;
inc() { return ++this.#count; }
}
const c = new Counter();
console.log(c.inc()); // 1سبب نجاح ذلك
الطرائق المُعادة هي إغلاقات على المتغيرات الخارجية. لقد عادت الدالة الخارجية، لكن نطاقها يظل موجودًا لأن تلك الإغلاقات ما زالت تشير إليه.
ذاكرة تخزين مؤقت باستخدام التذكّر
تُعد الحالة الخاصة مناسبة جدًا لذاكرات التخزين المؤقت. يظل كائن ذاكرة التخزين المؤقت مخفيًا، ويستمر بين الاستدعاءات.
function memoSquare() {
const cache = {};
return (n) => {
if (cache[n] === undefined) cache[n] = n * n;
return cache[n];
};
}
const sq = memoSquare();
console.log(sq(4)); // 16
console.log(sq(4)); // 16 (cached)تحقق سريع
المتغيرات الخاصة باستخدام الإغلاقات
مراجعة
تنشئ الإغلاقات خصوصية: إذ يتعذر الوصول إلى المتغيرات داخل المصنع من الخارج، لكنها تكون مشتركة بين الطرائق المُعادة. يتيح ذلك إنشاء عدادات محمية من العبث، وأرصدة تلتزم بالثوابت، ودوال مساعدة مخفية، وذاكرات تخزين مؤقت. ينتج كل استدعاء للمصنع حالة مستقلة. وتُعد حقول الفئات الحديثة الخاصة #private بديلًا، لكن الإغلاقات تتألق في الشيفرة القائمة على المصانع.
الأسئلة الشائعة
هل درس «المتغيرات الخاصة باستخدام الإغلاقات» مجاني؟
نعم — نص درس «المتغيرات الخاصة باستخدام الإغلاقات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «المتغيرات الخاصة باستخدام الإغلاقات»؟
أخفوا الحالة ضمن نطاق دالة. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟
لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «المتغيرات الخاصة باستخدام الإغلاقات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟
نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كيفية التقاط الإغلاقات للحالة
- المتغيرات الخاصة باستخدام الإغلاقات
- نمط الوحدة (IIFE)
- دوال المُنشئ