82- دروس جافا سكربت – الدوال – JS Function Invocation

## استدعاء الدوال في JavaScript

تُعتبر الدوال (Functions) في JavaScript من اللبنات الأساسية التي تُستخدم لتنفيذ العمليات المتكررة والمعقدة بطريقة منظمة وسهلة الفهم. يُعد استدعاء الدوال (Function Invocation) جزءًا جوهريًا من كيفية عمل الدوال، حيث يتم تنفيذ الكود داخل الدالة. يهدف هذا المقال إلى تقديم شرح مفصل حول كيفية استدعاء الدوال في JavaScript مع تقديم أمثلة متعددة لتوضيح المفاهيم.

### أنواع استدعاء الدوال

هناك عدة طرق لاستدعاء الدوال في JavaScript، وكل منها يؤثر على كيفية عمل الدالة وسياقها (Context). فيما يلي الأنواع الرئيسية لاستدعاء الدوال:

1. **الاستدعاء البسيط (Simple Invocation):**
يعتبر الاستدعاء الأكثر شيوعًا. يتم ببساطة كتابة اسم الدالة متبوعًا بالأقواس ()، مع تمرير المعاملات إذا لزم الأمر.

function greet(name) {
       console.log("Hello, " + name);
   }

   greet("Alice"); // Output: Hello, Alice
   

2. **الاستدعاء ككائن (Method Invocation):**
عندما تكون الدالة جزءًا من كائن، تُستدعى كطريقة (Method) لذلك الكائن. في هذه الحالة، يكون `this` داخل الدالة مرجعًا للكائن الذي يحتوي على الدالة.

let person = {
       name: "Bob",
       greet: function() {
           console.log("Hello, " + this.name);
       }
   };

   person.greet(); // Output: Hello, Bob
   

3. **الاستدعاء كدالة مُنشئة (Constructor Invocation):**
يتم استخدام الكلمة المفتاحية `new` لاستدعاء الدالة كمنشئ (Constructor). في هذه الحالة، يتم إنشاء كائن جديد، ويكون `this` مرجعًا لهذا الكائن الجديد.

function Person(name) {
       this.name = name;
   }

   let person1 = new Person("Carol");
   console.log(person1.name); // Output: Carol
   

4. **الاستدعاء عبر `call` و`apply`:**
تتيح لك `call` و`apply` التحكم في قيمة `this` عند استدعاء الدالة. [شركة برمجة مصرية] الفارق الأساسي بينهما هو كيفية تمرير المعاملات: تأخذ `call` قائمة من المعاملات، بينما تأخذ `apply` مصفوفة.

function introduce(greeting) {
       console.log(greeting + ", I'm " + this.name);
   }

   let person2 = { name: "David" };

   introduce.call(person2, "Hi"); // Output: Hi, I'm David
   introduce.apply(person2, ["Hello"]); // Output: Hello, I'm David
   

5. **الاستدعاء كدالة مربوطة (Bound Function):**
باستخدام `bind`، يمكنك إنشاء دالة جديدة تكون مرتبطة بسياق `this` محدد مسبقًا. تُعتبر هذه الطريقة مفيدة للحفاظ على السياق عبر الاستدعاءات غير المباشرة.

let person3 = {
       name: "Eve",
   };

   let boundIntroduce = introduce.bind(person3, "Greetings");
   boundIntroduce(); // Output: Greetings, I'm Eve
   

### سياق الاستدعاء (Invocation Context)

السياق (Context) هو [شركة برمجة مصرية] الكائن الذي تُنفذ الدالة فيه. في JavaScript، السياق الافتراضي هو الكائن العام `window` في المتصفحات، لكن يمكن تغييره باستخدام الطرق المذكورة أعلاه (`call`, `apply`, `bind`).

### أمثلة توضيحية

لنلقِ نظرة على بعض الأمثلة العملية:

#### مثال 1: استخدام الدوال كمُنشئات

function Car(model, year) {
    this.model = model;
    this.year = year;
}

let myCar = new Car("Toyota", 2020);
console.log(myCar.model); // Output: Toyota

#### مثال 2: استخدام `call` لتغيير السياق

function showDetails() {
    console.log(this.name + " is " + this.age + " years old.");
}

let user = {
    name: "Frank",
    age: 30
};

showDetails.call(user); // Output: Frank is 30 years old.

### الخاتمة

يُعد فهم كيفية استدعاء الدوال في JavaScript أمرًا بالغ الأهمية لتطوير برامج فعالة وقابلة لإعادة الاستخدام. من خلال التحكم في كيفية استدعاء الدوال وسياقها، يمكنك كتابة كود أكثر مرونة وديناميكية. نأمل أن يكون هذا الشرح قد أعطاك فهمًا أعمق لاستدعاء الدوال في JavaScript، مع القدرة على تطبيق هذه المعرفة في مشاريعك المستقبلية.