Kodax

الدوال (Functions) — JavaScript الأساسيات

الدوال (Functions)

الدوال هي كتل من الكود القابلة لإعادة الاستخدام تؤدي مهمة محددة.

لماذا نستخدم الدوال؟

1. إعادة الاستخدام - اكتب مرة، استخدم مرات

2. التنظيم - قسم الكود لأجزاء منطقية

3. سهولة الصيانة - عدل في مكان واحد

4. القراءة - أسماء واضحة للعمليات

طرق تعريف الدوال

1. Function Declaration

function greet(name) {
  return `مرحباً ${name}!`;
}

console.log(greet("أحمد")); // مرحباً أحمد!

2. Function Expression

const greet = function(name) {
  return `مرحباً ${name}!`;
};

console.log(greet("محمد")); // مرحباً محمد!

3. Arrow Function (ES6) ⭐

// الشكل الكامل
const greet = (name) => {
  return `مرحباً ${name}!`;
};

// اختصار (بدون أقواس للمعامل الواحد)
const greetShort = name => `مرحباً ${name}!`;

// بدون معاملات
const sayHello = () => "مرحباً!";

// معاملات متعددة (تحتاج أقواس)
const add = (a, b) => a + b;

المعاملات (Parameters)

المعاملات الأساسية

function add(a, b) {
  return a + b;
}

console.log(add(5, 3)); // 8

القيم الافتراضية

function greet(name = "زائر", greeting = "مرحباً") {
  return `${greeting} ${name}!`;
}

console.log(greet());           // مرحباً زائر!
console.log(greet("أحمد"));     // مرحباً أحمد!
console.log(greet("علي", "أهلاً")); // أهلاً علي!

Rest Parameters (...)

function sum(...numbers) {
  let total = 0;
  for (let num of numbers) {
    total += num;
  }
  return total;
}

console.log(sum(1, 2, 3));       // 6
console.log(sum(1, 2, 3, 4, 5)); // 15

القيمة المُرجعة (Return)

// دالة تُرجع قيمة
function square(x) {
  return x * x;
}

// دالة تُرجع كائن
function createUser(name, age) {
  return {
    name: name,
    age: age,
    isAdult: age >= 18
  };
}

// دالة بدون return (ترجع undefined)
function logMessage(msg) {
  console.log(msg);
}

النطاق (Scope)

let globalVar = "متغير عام";

function myFunction() {
  let localVar = "متغير محلي";
  console.log(globalVar);  // ✅ يمكن الوصول
  console.log(localVar);   // ✅ يمكن الوصول
}

console.log(globalVar);  // ✅ يمكن الوصول
console.log(localVar);   // ❌ خطأ - غير معرف

Closure (الإغلاق)

function createCounter() {
  let count = 0;  // متغير خاص
  
  return function() {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3

// لا يمكن الوصول لـ count مباشرة!

Callback Functions

function processData(data, callback) {
  // معالجة البيانات
  let result = data.toUpperCase();
  // استدعاء الدالة الممررة
  callback(result);
}

processData("مرحباً", function(result) {
  console.log(result); // مرحباً
});

// باستخدام Arrow Function
processData("أهلاً", result => console.log(result));

Higher-Order Functions

// دالة تُرجع دالة
function multiply(factor) {
  return function(number) {
    return number * factor;
  };
}

const double = multiply(2);
const triple = multiply(3);

console.log(double(5));  // 10
console.log(triple(5));  // 15

IIFE (Immediately Invoked Function Expression)

(function() {
  let secret = "كلمة سرية";
  console.log("تُنفذ فوراً!");
})();

// مع معاملات
(function(name) {
  console.log(`مرحباً ${name}`);
})("أحمد");
// دالة بسيطة
function greet(name) {
  return `مرحباً ${name}!`;
}
console.log(greet("أحمد"));

// Arrow Function
const add = (a, b) => a + b;
console.log("5 + 3 =", add(5, 3));

// دالة مع قيمة افتراضية
const multiply = (a, b = 1) => a * b;
console.log("5 * 3 =", multiply(5, 3));
console.log("5 * 1 =", multiply(5));

// Rest Parameters
const sum = (...nums) => nums.reduce((a, b) => a + b, 0);
console.log("مجموع:", sum(1, 2, 3, 4, 5));
اختبر فهمك