0Pricing
JavaScript Academy · درس

المتغيرات الخاصة باستخدام الإغلاقات

أخفوا الحالة ضمن نطاق دالة.

المتغيرات الخاصة باستخدام الإغلاقات درس مجاني في 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. كيفية التقاط الإغلاقات للحالة
  2. المتغيرات الخاصة باستخدام الإغلاقات
  3. نمط الوحدة (IIFE)
  4. دوال المُنشئ
← العودة إلى JavaScript Academy