الدوال السهمية في لغة JavaScript


الدوال السهمية في لغة JavaScript

يا هلا والله! اليوم بنتكلم عن الدوال السهمية (Arrow Functions) في جافاسكريبت. شي مرة رهيب ويخلي كودك أنظف وأسهل للقراءة، خصوصاً لو كنت متعود على الدوال العادية.

وش هي الدوال السهمية؟

ببساطة، هي طريقة أحدث وأكثر اختصار لكتابة الدوال في JavaScript. شف الفرق:

دالة عادية (Function Expression):

const greet = function(name) {
  return <code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مرحباً يا ${name}!</code>;
};
console.log(greet('علي')); // مرحباً يا علي!

دالة سهمية (Arrow Function):

const greetArrow = (name) => {
  return <code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مرحباً يا ${name}!</code>;
};
console.log(greetArrow('فاطمة')); // مرحباً يا فاطمة!

شفت الفرق؟ السهم => هو السر هنا!

ليش نستخدم الدوال السهمية؟

فيه سببين رئيسيين يخلونها خيار ممتاز في أغلب الأوقات:

1. اختصار الكود (Code Brevity)

الدوال السهمية تخلي الكود أقصر وأوضح، خصوصاً للدوال البسيطة اللي تسوي شي واحد وترجع قيمة مباشرة. شوف الأمثلة هذي:

إذا دالة فيها سطر واحد وترجع قيمة مباشرة:

بدل ما تكتب كذا:

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

تقدر تكتب كذا (أقصر بكثير!):

const addArrow = (a, b) => a + b;
console.log(addArrow(5, 3)); // 8

لاحظ: إذا الكود سطر واحد ويرجع قيمة، ما يحتاج أقواس معقوفة {} ولا كلمة return.

إذا دالة بمعامل واحد:

ما يحتاج أقواس حول المعامل:

const square = num => num * num;
console.log(square(4)); // 16

2. التعامل مع this (Handling this)

هذي أكبر ميزة للدوال السهمية، وبتوفر عليك صداع كثير لو كنت تتعامل مع this في الدوال العادية. في الدوال العادية، قيمة this تتغير حسب سياق استدعاء الدالة (كيف تم استدعاؤها). لكن في الدوال السهمية، قيمة this تكون ثابتة، وتاخذها من السياق اللي انكتبت فيه الدالة السهمية نفسها (lexical this).

خلنا نشوف مثال:

const person = {
  name: 'خالد',
  greetRegular: function() {
    setTimeout(function() {
      console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">أهلاً يا ${this.name}</code>); // 'this' هنا يشير لـ global object (window في المتصفح) أو undefined في الوضع الصارم
    }, 1000);
  },
  greetArrow: function() {
    setTimeout(() => {
      console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">أهلاً يا ${this.name}</code>); // 'this' هنا يشير لـ person object
    }, 1000);
  }
};

person.greetRegular(); // بعد ثانية: أهلاً يا undefined (أو شيء آخر حسب البيئة)
person.greetArrow();   // بعد ثانية: أهلاً يا خالد
ملاحظة مهمة: بسبب طريقة تعاملها مع this، الدوال السهمية ما تنفع تكون method في كائن إذا كنت تحتاج this يشير للكائن نفسه. ولا تستخدمها كـ constructor للدوال اللي تسوي كائنات جديدة (يعني مع new).

متى ما تستخدمها؟ (When NOT to use them?)

صحيح أنها رهيبة، بس فيه حالات ما تكون الخيار الأفضل:

  1. كميثود في كائن: إذا كنت تحتاج this يشير للكائن نفسه، الدوال العادية أفضل. (شف مثال greetRegular فوق).
  2. كـ Constructors: الدوال السهمية ما تقدر تستخدمها مع new لإنشاء كائنات.
  3. مع arguments object: الدوال السهمية ما عندها الـ arguments object الخاص فيها. لو كنت تحتاج توصل لكل المعاملات اللي تمررت للدالة (حتى لو ما حددتها بشكل صريح)، استخدم دالة عادية أو الـ Rest Parameters (...args).
  4. مع Event Handlers اللي تحتاج this للعنصر: في بعض الـ Event Handlers، تحتاج this يشير للعنصر اللي سوى الـ Event. في هذي الحالة، الدوال العادية أو ربط this يدوياً أفضل.

خلاصة الكلام

الدوال السهمية أداة قوية جداً في جافاسكريبت تخلي كودك أنظف وأسهل في إدارة this. استخدمها في أغلب الأوقات، خصوصاً لما تمرر دالة كـ callback، بس انتبه للحالات اللي ذكرناها فوق. استمتع بالكود!