تعبيرات الدوال

تعبيرات الدوال هي دوال. التي تم إنشاؤها حيث من المتوقع أن تعبيرًا. ستواجه غالبًا تعبيرات دالة كقيم تم تعيينها لمتغيّر. على الرغم من أن تعريف الدالة دائمًا اسمًا، يمكنك استخدام تعبيرات الدوال لإنشاء من خلال حذف المعرّف واتّباع الكلمة الرئيسية function مع زوج من الأقواس يحتوي على معلمات اختيارية:

const myVariable = function() { };

يمكنك بعد ذلك الاتصال بهؤلاء تعبيرات الدوال باستخدام معرف المتغير:

const myVariable = function() {
    console.log( "This is my function." );
};

myVariable();
> "This is my function."

يمكنك أيضًا استخدام تعبيرات الدوالّ لإنشاء دوالّ مُسمّاة باستخدام بنية نحوية مشابهة لتعريفات الدوالّ:

const myVariable = function myFunction() {
    console.log( "This is my function." );
};

myVariable();
> "This is my function."

ومع ذلك، على عكس إعلانات الدوال، يمكن تحويل تعبير الدالة المُسمّاة يتم الوصول إليه عن طريق اسم الدالة فقط داخل الدالة نفسها:

const myVariable = function myFunction() {
  console.log( `I'm a ${ typeof myFunction }.`);
};

typeof myFunction;
> "undefined"

typeof myVariable;
> "function"

myVariable();
> "I'm a function."

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

const myVariable = function myFunction() {
    console.log( "One second elapsed." );
    setTimeout( myFunction, 1000 );
};

setTimeout( myVariable, 1000 );
> "One second elapsed."
> "One second elapsed."
> "One second elapsed."

تعبيرات الدوالّ الرمزية

تعابير الدوال السهمية (غالبًا ما تُعرف باسم "دوال السهم" أو في حالات نادرة، "lambda الدوال") في ES6 لتوفير بناء جملة موجز لإنشاء تعبيرات الدوال المجهولة المصدر مع بعض السلوكيات الفريدة.

يمكنك إنشاء دالة سهم حيث كان من المتوقع وجود تعبير، سبيل المثال، كقيمة مخصصة لمتغير. في شكلها الأكثر شيوعًا، تتكوّن دالة السهم من زوج من الأقواس المتطابقة التي تحتوي على صفر أو أكثر من المَعلمات، وسهم مكوّن من علامة تساوي واحدة وحرف أكبر من (=>)، وزوج من الأقواس المتعرجة المتطابقة التي تحتوي على نص الدالة:

const myFunction = () => {};

في ظل ظروف معينة، يمكنك جعل بناء الجملة أكثر إحكاما. إذا كنت باستخدام معلمة واحدة فقط، يمكنك استبعاد أقواس البدء:

const myFunction = myParameter => {};

عندما تريد أن تعرض الدالة body تعبير فردي، عدم تضمين نص الدالة بين أقواس متعرجة الكلمة الرئيسية return مطلوبة:

const myFunction = () => 2 + 2

myFunction()
> 4

الدوال السهمية فريدة من نوعها لأنها ليس لها سياق خاص بها arguments أو this وبدلاً من ذلك، يكتسبون كليهما القيم من جدول البيانات البيئة التي تتضمن معجمًا، أقرب ما يكون التي توفر هذه السياقات.

function myParentFunction() {
    this.myProperty = true;
    let myFunction = () => {
            console.log( this );
    }
    myFunction();
};

let myInstance = new myParentFunction();
> Object { myProperty: true }

دوال سهم الاتصال

لا تربط الدوال السهم الوسيطات بنفس طريقة ربط الوسيطات الأنواع الأخرى من الدوال. يكتسب كائن arguments في نص دالة السهم قيمته من الأقرب لدالة السهم هذه بيئة تضمين قاموسًا:

function myFunction() {
    let myArrowFunction = () => {
            console.log( arguments[ 0 ] );
    }
    myArrowFunction( true );
};

myFunction( false );
> false

في هذا المثال، هناك دالة خارجية يتم استدعاءها باستخدام الوسيطة false دالة السهم الداخلي مع الوسيطة true. بما أنّ عنصر arguments داخل دالة السهم يُحلّ إلى الربط في الدالة الخارجية، تسجِّل الدالة الداخلية false للدالة الخارجية.

إذا لم يكن هناك كائن arguments ليتم اكتسابه من السياق الرئيسي، سيتم لم يتم تحديد كائن arguments في الدالة، وتؤدي محاولة الوصول إليه إلى خطأ:

let myArrowFunction = () => {
    console.log(arguments);
};
myArrowFunction( true );
> Uncaught ReferenceError: arguments is not defined

تعبيرات الدوال التي يتمّ استدعاؤها على الفور (IIFE)

تعبير الدالة المستدع فورًا (IIFE)، ويُطلق عليه أيضًا في بعض الأحيان "وظيفة مجهولة التنفيذ الذاتي"، هو تعبير دالة يسمى على الفور عند تحديده. تستخدِم دالة IIFE تعبير دالة تم إنشاؤه من خلال إحاطة الدالة بعامل تجميع. ثم يستدعي زوج ثاني متطابق من الأقواس الدالة، إما على الفور اتباع تعريف الدالة نفسها أو اتباع التجميع مباشرةً . إذا كنت تستخدم دالة قياسية، فلا يوجد فرق عملي بين النهجين:

(function() {
    console.log( "IIFE.")
    }
)();
> "IIFE."

(function() {
    console.log( "IIFE.")
    }
());
> "IIFE."

يستدعي المثال الأول تعبير الدالة المجمّعة. المثال الثاني باستدعاء بيان دالة داخل عوامل التجميع، والنتيجة النهائية ثم يتم تقييمها على أنها تعبير مجمّع. والنتيجة هي نفسها في الحالة.

ومع ذلك، هناك فرق عندما تكون دالة IIFE دالة سهم. في هذا الحالة، يجب أن تكون الأقواس المستخدَمة لاستدعاء الدالة خارج عوامل التجميع، لأنّ دالة السهم ليست تعبيرًا بحد ذاتها، ولكن يجب إنشاؤها في سياق يُتوقّع فيه ظهور تعبير. تحاول محاولة استدعاء حيث تعني دالة السهم من داخل نطاق عوامل التجميع باستدعاء دالة سهم لم يتم إنشاؤها بعد في سياق التعبير:

( () => {
    console.log( "IIFE." );
}() );
> Uncaught SyntaxError: missing ) in parenthetical

ولأن عوامل التجميع تتوقع تعبيرًا، فإن دالة السهم داخل يتم تحديدها، مما يسمح للأقواس التي تليها باستدعاء المجموعة التعبير:

( () => {
    console.log( "IIFE." );
} )();
> "IIFE."

هي التطبيقات القديمة التي تستخدم بشكل متكرر إطارات IIFE لإدارة النطاق، وتحديدًا تجنُّب التأثير سلبًا على النطاق العالمي باستخدام المتغيّرات على مستوى الوظائف وتعريفات الدوال. قبل طرح نطاق الحظر في ES6، كان من الشائع إحاطة نص برمجي كامل بـ IIFE لمنع غير مقصود في النطاق العالمي.

التحقق من فهمك

هل يمكنك استدعاء تعبير دالة مسماة بالاسم خارج الوظيفة؟

نعم
لا