الدوال في جافاسكريبت

الدوال في جافاسكريبت

تشرح هذه المقالة الدوال في جافاسكريبت۔

YouTube Video

الدوال في جافاسكريبت

الدوال في جافاسكريبت هي كتل من الأكواد القابلة لإعادة الاستخدام تُستخدم لتنفيذ مهام معينة۔ استخدام الدوال يُحسن من قراءة الكود ويُسهل صيانته۔ يمكن تعريف الدوال بعدة طرق والتعامل معها بمرونة باستخدام المعاملات وقيم الإرجاع۔

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

تصريح الدالة

يمكن تعريف الدوال باستخدام الكلمة المفتاحية function۔ تصريحات الدوال يتم رفعها قبل تشغيل الكود، لذا يمكن استدعاؤها قبل تعريفها۔

1console.log(greet("Everyone")); // Hello, Everyone
2
3function greet(name) {
4    return "Hello, " + name;
5}
6
7console.log(greet("Alice")); // Hello, Alice

في هذا المثال، نظرًا لأن دالة greet تم استدعاؤها قبل تصريحها، يتم عرض Hello, Everyone و Hello, Alice۔

تعريف الدالة بالتعبير

يمكن أيضًا تعريف الدوال عن طريق إسنادها إلى متغير۔ في هذه الحالة، لا يتم رفع الدالة ولا يمكن استدعاؤها إلا بعد تعريفها۔

1const greet = function(name) {
2    return "Hello, " + name;
3};
4
5console.log(greet("Bob")); // Hello, Bob

في هذا المثال، سيتم عرض Hello, Bob۔

دالة السهم

دوال السهم هي طريقة لتعريف الدوال باستخدام صياغة أقصر۔ تكون مفيدة بشكل خاص عند استخدام الدوال المجهولة (الدوال التي ليس لها اسم)۔ تتصرف دوال السهم بشكل مختلف فيما يتعلق بالكلمة المفتاحية this۔

 1const greet = (name) => {
 2    return "Hello, " + name;
 3};
 4
 5// When it can be expressed in a single line,
 6// `return` and curly braces can be omitted
 7const greetShort = name => "Hello, " + name;
 8
 9console.log(greet("Charlie")); // Hello, Charlie
10console.log(greetShort("Dave")); // Hello, Dave

يمكن تعريف الدوال كـ greet و greetShort في هذا المثال۔ إذا كانت الدالة عبارة عن سطر واحد، يمكنك حذف الأقواس {} كما في greetShort۔

عناصر الدالة

المعاملات

القيم التي يتم تمريرها إلى الدالة تُسمّى المعاملات۔ من خلال تحديد المعاملات عند تعريف دالة، يمكنك تمرير القيم عند استدعاء الدالة۔

1function add(a, b) {
2    return a + b;
3}
4
5console.log(add(2, 3)); // 5

الوسائط الافتراضية

يمكنك تحديد قيمة افتراضية إذا لم يتم تمرير قيمة إلى الوسائط۔

1function greet(name = "Guest") {
2    return "Hello, " + name;
3}
4
5console.log(greet()); // Hello, Guest
6console.log(greet("Alice")); // Hello, Alice

في هذا المثال، إذا تم استدعاء greet()، سيتم استخدام القيمة الافتراضية Guest۔

القيمة المعادة

يمكنك إرجاع قيمة معادة من الدالة باستخدام عبارة return۔ إذا لم تكن هناك عبارة return، فإن الدالة تعيد undefined۔

1function greet(name) {
2    console.log('Hello, ' + name + '!');
3}
4function square(num) {
5    return num * num;
6}
7
8console.log(square(4)); // 16
9console.log(greet('Alice')); // undefined

في هذا المثال، بما أن greet لا تعيد قيمة، فإن القيمة المعادة هي undefined۔

الدالة المجهولة

الدالة التي لا تحتوي على اسم تُسمى دالة مجهولة۔ غالبًا ما تُستخدم كتعبيرات دوال أو كدوال ذات السهم۔

1const double = function(num) {
2    return num * 2;
3};
4
5console.log(double(5)); // 10

تعبير الدالة المفعلة فوراً (IIFE)

تعبير الدالة المفعلة فوراً (IIFE) هو دالة يتم تنفيذها بمجرد تعريفها۔ عادةً ما تُستخدم للتحكم في النطاق (scope)۔

1/* Example of IIFE: Immediately Invoked Function Expression */
2(function() {
3    console.log("This is an IIFE");
4})(); // This is an IIFE

يتم تنفيذها بمجرد إعلانها۔

الدالة الاستدعائية

تمرير دالة كوسيط إلى دالة أخرى لتنفيذها لاحقًا يُسمى دالة استدعائية۔ غالبًا ما تُستخدم في المعالجة غير المتزامنة والتعامل مع الأحداث۔

1function processData(callback) {
2    let data = "Processed Data";
3    callback(data);
4}
5
6processData(function(result) {
7    console.log(result); // Processed Data
8});

في هذا المثال، يتم تمرير دالة تطبع قيمة إلى وحدة التحكم كدالة استدعائية۔

الدالة التكرارية

استدعاء الدالة لنفسها يُسمى التكرار، والدالة التي تنفذ عملية متكررة باستخدام هذا تُسمى دالة تكرارية۔ على سبيل المثال، يمكن تنفيذ دالة لحساب مضروب العدد باستخدام التكرار كما يلي۔

 1function factorial(n) {
 2    if (n === 0) {
 3        return 1;
 4    } else {
 5        return n * factorial(n - 1);
 6    }
 7}
 8
 9console.log(factorial(5));
10// Output : 120
11// (5 * 4 * 3 * 2 * 1 = 120)

في هذا المثال، سيتم عرض مضروب العدد 5، والذي هو 120۔

الكلمة المفتاحية this

this المستخدمة داخل الدالة تشير إلى الكائن الذي تشير إليه الدالة۔ في الدوال العادية، تشير إلى الكائن الذي استدعاها، ولكن في دوال السهم تحتفظ بـ this الخاصة بالنطاق الذي تم تعريفها فيه۔

 1const obj = {
 2    name: "Alice",
 3    greet: function() {
 4        console.log(this.name); // Refers to "Alice"
 5    }
 6};
 7
 8obj.greet(); // Alice
 9
10const obj2 = {
11    name: "Bob",
12    greet: () => {
13        // Arrow function refers to the outer scope (undefined here)
14        console.log(this.name);
15    }
16};
17
18obj2.greet(); // undefined

يتم تعريف greet في متغير obj باستخدام الكلمة الأساسية function۔ لذلك، تشير الكلمة الأساسية this إلى الكائن الخاص بمتغير obj۔ من جهة أخرى، يتم تعريف greet في متغير obj2 باستخدام وظيفة السهم۔ لذلك، تشير الكلمة الأساسية this إلى الكائن في النطاق الخارجي وتكون undefined في هذا المثال۔

نطاق الدوال والإغلاقات

لا يمكن الوصول إلى المتغيرات المعرفة داخل الدالة من خارجها۔ ويُطلق على ذلك نطاق الدالة۔ هناك أيضًا ميزة تُسمى الإغلاق، والتي تحتفظ بالنطاق عند النقطة التي يتم تعريف الدالة فيها۔

 1function outer() {
 2    let outerVar = "I am outer!";
 3
 4    function inner() {
 5        console.log(outerVar); // Can access outerVar
 6    }
 7
 8    return inner;
 9}
10
11const innerFunc = outer();
12innerFunc(); // I am outer!

في هذا المثال، يمكن للدالة inner الوصول إلى المتغير outerVar لأنها تحتفظ بالنطاق الذي تم تعريف الدالة فيه۔

الملخص

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

الدوال هي واحدة من المفاهيم المهمة في JavaScript، التي تستفيد من بنيتها المرنة۔

يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔

YouTube Video