مصنع الأكواد: الدوال (Functions) 🏭

تعلم كيف تحول كودك إلى "آلة" قابلة لإعادة الاستخدام في أي وقت.

1. ما هي الدالة؟ (The Concept)

المهمة: كتابة الكود مرة واحدة وتشغيله ألف مرة.

الشرح التفصيلي:

بدلاً من كتابة كود حساب الخصم لكل لعبة يدوياً، نصنع "دالة" تأخذ السعر وتعطينا النتيجة. الدالة تتكون من:

تخيل الدالة كخلاط فواكه: تعطيه (برتقال) كمدخل، يقوم بـ (الخلط) كعملية، ويعطيك (عصير) كمخرج.

2. هيكل الدالة (Structure)

المهمة: إتقان كتابة الـ Syntax الصحيح.

الكود البرمجي:

// 1. تعريف الدالة
function sayHello(name) {
  console.log("أهلاً يا " + name);
}

// 2. استدعاء الدالة (Calling)
sayHello("محمد"); //سيطبع: أهلاً يا محمد
sayHello("أحمد"); // سيطبع: أهلاً يا أحمد

3. الكلمة السحرية: Return

المهمة: جعل الدالة تعيد قيمة لنستخدمها لاحقاً.

الشرح التفصيلي:

أحياناً لا نريد طباعة النتيجة فوراً، بل نريد "حفظها" في متغير. هنا نستخدم return.

الكود البرمجي:

function calculateTotal(price, tax) {
  return price + tax;
}

let total = calculateTotal(100, 15);
console.log(total); // 115
ملحوظة هامة: بمجرد وصول الدالة لكلمة return، تتوقف عن العمل تماماً وتخرج النتيجة.

13. لغز الذاكرة (Pass by Value vs Reference)

هل تساءلت يوماً لماذا عندما تغير قيمة في مصفوفة جديدة، تتغير في المصفوفة الأصلية أيضاً؟ هذا لأن جافا سكريبت لا ينسخ المصفوفات، بل ينسخ "مكانها في الذاكرة" (Pointer).

- القيم البسيطة (Primitive): مثل الأرقام والنصوص، يتم نسخ القيمة نفسها.
- القيم المعقدة (Objects/Arrays): يتم نسخ "العنوان"، أي أن كلا المتغيرين يشيران لنفس المكان.
let arr1 = [1, 2];
let arr2 = arr1; // هنا نسخت العنوان فقط!
arr2.push(3);
console.log(arr1); // ستجدها [1, 2, 3] أيضاً!

14. التحدث بين النوافذ (Cross-Window Communication)

كيف يمكن لصفحة أن تتحدث مع صفحة أخرى مفتوحة في تبويب مختلف أو داخل iframe؟ نستخدم الـ postMessage لتبادل البيانات بأمان.

مهم جداً لحماية المواقع من الهجمات
// إرسال رسالة لتبويب آخر
otherWindow.postMessage("Hello from PhineX!", "https://target-site.com");

// استقبال الرسالة
window.addEventListener("message", (event) => {
  if (event.origin !== "https://trusted-site.com") return;
  console.log(event.data);
});

15. البرمجة الوظيفية (Functional Programming)

هذه الفلسفة تعتمد على كتابة دوال "نقية" لا تغير أي شيء خارج حدودها، مما يقلل الأخطاء بنسبة 90%.

الدالة النقية (Pure Function): هي دالة إذا أعطيتها نفس المدخلات، تعطيك نفس المخرجات دائماً، ولا تغير أي متغير خارجي.
// دالة غير نقية (تغير متغير خارجي - خطر!)
let total = 0;
const add = (n) => total += n;

// دالة نقية (آمنة تماماً)
const addPure = (a, b) => a + b;

16. المراقب الذكي (JavaScript Proxy)

هل تريد تنفيذ كود معين بمجرد أن يحاول شخص "قراءة" أو "تعديل" قيمة داخل Object؟ الـ Proxy يعمل كـ "حارس أمن" للكائنات.

const user = { name: "Ahmed" };

const proxyUser = new Proxy(user, {
  get(target, prop) {
    console.log(`يتم الآن قراءة الخاصية: ${prop}`);
    return target[prop];
  }
});

console.log(proxyUser.name); // سيطبع في الكونسول رسالة الرقابة أولاً

اختبار مهندس الدوال 🧠

س1: كيف نقوم بـ "استدعاء" دالة اسمها startApp؟



س2: ما هي الكلمة التي تجعل الدالة "تعيد" قيمة للخارج؟