تعبير الدالة المستدعى فورًا
تعبير الدالة المُستدعى فورًا (أو IIFE ، ويُنطق "إيفي"، IPA /ˈɪf.i/) هو أسلوب برمجي يُستخدم لإنشاء نطاق معجمي باستخدام نطاق الدالة . وقد شاع استخدامه في جافا سكريبت [ 1 ] كوسيلة لدعم البرمجة المعيارية قبل ظهور حلول أكثر توحيدًا مثل CommonJS ووحدات ES . [ 2 ]
يمكن استخدام تعابير الدوال المُستدعاة فورًا لتجنب رفع المتغيرات من داخل الكتل، مما يحمي من تلويث البيئة العامة ، ويتيح في الوقت نفسه الوصول العام إلى الدوال مع الحفاظ على خصوصية المتغيرات المُعرّفة داخل الدالة. بعبارة أخرى، تُغلّف هذه الطريقة الدوال والمتغيرات، وتبقيها خارج النطاق العام، وتمنحها نطاقًا محليًا.
الاستخدام
يمكن كتابة تعابير الدوال المُستدعاة مباشرةً بعدة طرق مختلفة. [ 3 ] من الاصطلاحات الشائعة وضع تعبير الدالة - ومعامل استدعائها اختياريًا - بين قوسين مع معامل التجميع، [ 4 ] لإخبار المحلل اللغوي صراحةً بتوقع تعبير. خلاف ذلك، في معظم الحالات، عندما يصادف المحلل اللغوي الكلمة المفتاحية، فإنه يعاملها كإعلان دالة (عبارة)، وليس كتعبير دالة. [ 5 ] [ 6 ] function
( function () { /* ... */ })(); ( function () { /* ... */ }()); (() => { /* ... */ })(); // باستخدام دوال الأسهم في ES6 (مع العلم أن الأقواس مسموحة فقط في الخارج)في السياقات التي يُتوقع فيها وجود تعبير، لا يكون وضع التعبير بين قوسين ضرورياً:
let f = function () { /* ... */ }(); true && function () { /* ... */ }(); 0 , function () { /* ... */ }();يتم تمرير المتغيرات إلى النطاق على النحو التالي:
( function ( a , b ) { /* ... */ })( "hello" , "world" ); ( function ( a = "hello" , b = "world" ) { /* ... */ })(); // يعمل أيضًايُعدّ القوس الأول أحد الأمثلة على الحالات التي قد يُسبب فيها الإدراج التلقائي للفاصلة المنقوطة (ASI) في جافا سكريبت مشاكل؛ إذ يُفسَّر التعبير حينها على أنه استدعاء للمصطلح الأخير في السطر السابق. في بعض أنماط البرمجة التي تحذف الفواصل المنقوطة الاختيارية، تُوضع الفاصلة المنقوطة أمام القوس، وتُعرف باسم الفاصلة المنقوطة الوقائية . [ 7 ] [ 8 ] على سبيل المثال:
a = b + c ;( function () { // الكود })();...لتجنب تحليلها على أنها c().
أمثلة
يكمن مفتاح فهم أنماط التصميم مثل IIFE في إدراك أنه قبل ES6، كانت لغة جافا سكريبت تقتصر على نطاق الدوال (وبالتالي تفتقر إلى نطاق الكتل )، حيث يتم تمرير القيم بالمرجع داخل الدوال المغلقة . [ 9 ] لم يعد هذا هو الحال، إذ تُطبّق نسخة ES6 من جافا سكريبت نطاق الكتل باستخدام الكلمتين المفتاحيتين new letو const. [ 10 ]
// قبل ES6: إنشاء نطاق باستخدام دالة مُنفذة فورًا (IIFE) var foo = 1 ; var bar = 2 ; ( function (){ var foo = 3 ; // يُخفي المتغير الخارجي `foo` bar = 4 ; // يستبدل المتغير الخارجي `bar` })(); console . log ( foo , bar ); // 1 4// منذ ES6: إنشاء نطاق باستخدام الأقواس المعقوفة مع let و const const foo = 1 ; let bar = 2 ; { const foo = 3 ; // يحجب `foo` الخارجي bar = 4 ; // يستبدل `bar` الخارجي } console . log ( foo , bar ); // 1 4سياق التقييم
يؤدي غياب نطاق الكتلة إلى رفع تعريف المتغيرات المُعرَّفة داخل حلقة تكرار (على سبيل المثال) إلى أعلى الدالة المُحيطة بها. وقد يكون تقييم دالة تعتمد على متغيرات تم تعديلها بواسطة الدالة الخارجية (بما في ذلك عن طريق التكرار) أمرًا صعبًا. ويمكننا ملاحظة ذلك بدون حلقة تكرار إذا قمنا بتحديث قيمة بين تعريف الدالة واستدعائها. [ 11 ]
let v , getValue ; v = 1 ; getValue = function () { return v ; }; v = 2 ;getValue (); // 2على الرغم من أن النتيجة قد تبدو واضحة عند التحديث vيدويًا، إلا أنها قد تنتج نتائج غير مقصودة عند getValue()تعريفها داخل حلقة تكرارية.
بعد ذلك، يتم تمرير الدالة vكوسيط ويتم استدعاؤها على الفور، مع الحفاظ على سياق تنفيذ الدالة الداخلية. [ 12 ]
let v , getValue ; v = 1 ; getValue = ( function ( x ) { return function () { return x ; }; })( v ); v = 2 ;getValue (); // 1هذا يعادل الكود التالي:
let v , getValue ; v = 1 ; function f ( x ) { return function () { return x ; }; }; getValue = f ( v ); v = 2 ;getValue (); // 1إنشاء متغيرات خاصة ووظائف الوصول إليها
تُعدّ الدوال المُنفّذة فورًا (IIFEs) مفيدةً أيضًا لإنشاء طرق خاصة للدوال التي يمكن الوصول إليها، مع إتاحة بعض الخصائص للاستخدام لاحقًا. [ 13 ] المثال التالي مأخوذ من منشور ألمان حول الدوال المُنفّذة فورًا. [ 1 ]
// "counter" هي دالة تُرجع كائنًا يحتوي على خصائص، وهي في هذه الحالة دوال. let counter = ( function () { let i = 0 ;return { get : function () { return i ; }, set : function ( val ) { i = val ; }, increment : function () { return ++ i ; } }; })();// تستدعي هذه الدوال خصائص الدالة التي تُرجعها الدالة "counter". counter.get ( ) ; // 0 counter.set ( 3 ) ; counter.increment ( ); // 4 counter.increment ( ); // 5إذا حاولنا الوصول إلى المتغير counter.iمن البيئة العامة، فسيكون غير مُعرَّف، لأنه مُضمَّن داخل الدالة المُستدعاة وليس خاصيةً من خصائص المتغير counter. وبالمثل، إذا حاولنا الوصول إلى المتغير i، فسيؤدي ذلك إلى خطأ، لأننا لم نُصرِّح عنه iفي البيئة العامة.
مصطلحات
كانت تُعرف في الأصل باسم "دالة مجهولة ذاتية التنفيذ"، [ 14 ] وقد قدم بن ألمان لاحقًا المصطلح الحالي IIFE كاسم أكثر دقة من الناحية الدلالية لهذا المصطلح، وذلك بعد فترة وجيزة من مناقشته على مجموعة comp.lang.javascript. [ 1 ] [ 15 ] [ 16 ]
والجدير بالذكر أن الوظائف التي يتم استدعاؤها على الفور لا يلزم أن تكون مجهولة الهوية بطبيعتها، ويحظر الوضع الصارم لـ ECMAScript 5 ذلك arguments.callee، [ 17 ] مما يجعل المصطلح الأصلي تسمية خاطئة .
انظر أيضاً
مراجع
- 1 2 3 ألمان، بن (15 نوفمبر 2010). "تعبيرات الدوال المستدعاة فورًا" . مؤرشف من الأصل في 1 ديسمبر 2017. تم الاطلاع عليه في 18 يناير 2019 .
- ↑ ماكجينيس، تايلر (15 يناير 2019). "وحدات جافا سكريبت: من الدوال المُنفذة فورًا إلى CommonJS إلى وحدات ES6" . ui.dev . تم الاطلاع عليه بتاريخ 18 أغسطس 2021 .
- ↑ ليندلي، كودي (2013). التنوير في جافا سكريبت . أورايلي. ص 61. ISBN 978-1-4493-4288-3.
- ↑ "عامل التجميع" . شبكة مطوري موزيلا. 2 أكتوبر 2023.
- ↑ زاكاس، نيكولاس (2012). جافا سكريبت قابلة للصيانة . أورايلي. ص 44. ISBN 978-1-4493-2768-2.
- ↑ أكسل راوشمير. "استكشاف جافا سكريبت" .
- ↑ "إدراج الفاصلة المنقوطة في جافا سكريبت: كل ما تحتاج لمعرفته" . 28 مايو 2010. مؤرشف من الأصل في 2 أكتوبر 2017.
- ↑ مارونيتش، ميسلاف (7 مايو 2010). "الفواصل المنقوطة في جافا سكريبت اختيارية" . مؤرشف من الأصل في 8 أغسطس 2017.
- ^ هافربيك ، مارين (2011). جافا سكريبت بليغة . لا يوجد صحافة النشا. ص 29 – 30. ISBN 978-1-59327-282-1.
- ↑ أوريندورف، جيسون (31 يوليو 2015). "ES6 بالتفصيل: let و const" . مدونة موزيلا هاكس لمطوري الويب . موزيلا . تاريخ الاسترجاع: 16 أكتوبر 2024 .
- ↑ ألمان، بن. "simple-iife-example.js" . جيت هاب . تم الاطلاع عليه في 5 فبراير 2013 .
- ↑ أوتيرو، سيزار؛ لارسن، روب (2012). jQuery الاحترافي . جون وايلي وأولاده. ص 31. ISBN 978-1-118-22211-9.
- ↑ ريتيج، باسكال (2012). تطوير ألعاب الجوال الاحترافية بتقنية HTML5 . جون وايلي وأولاده. ص 145. ISBN 978-1-118-30133-3.
- ^ ريسيج ، جون (2006). تقنيات جافا سكريبت للمحترفين . Apress. ص. 29. ردمك 978-1-4302-0283-7.
- ↑ عثماني، آدي (2012). تعلم أنماط تصميم جافا سكريبت . أورايلي. ص 206. ISBN 978-1-4493-3487-1.
- ↑ باجو، يوهانس. "الأقواس المغلقة في تعريف الدالة متبوعة باستدعائها" . تم الاطلاع عليه بتاريخ 19 أبريل 2010 .
- ↑ "الوضع الصارم" . مرجع جافا سكريبت من موزيلا . شبكة مطوري موزيلا . تم الاطلاع عليه بتاريخ 4 فبراير 2013 .
روابط خارجية
- "الدوال ونطاق الدوال" . مرجع جافا سكريبت من موزيلا . شبكة مطوري موزيلا . تم الاطلاع عليه بتاريخ 4 فبراير 2013 .
- جافا سكريبت
- مفاهيم لغة البرمجة
