البرمجة

كيف يعمل Function.apply.bind؟

في الشيفرة المُقدمة، يتم استخدام مفهومين مهمين في JavaScript: الوعود (Promises) والدوال. يستخدم الكود الوعود لإدارة التنفيذ الغير متزامن (Asynchronous)، ويُظهر كيف يمكن استخدام الدوال لتحكم في تدفق البيانات.

أولاً، يُعرف في الكود دالة getY(x) التي تقوم بإرجاع وعد (Promise). هذه الوعدة تحتوي على دالة تأخير (setTimeout) التي تنتظر 100 ميلي ثانية قبل أن تستدعي دالة الحل (resolve) وتقوم بتمرير القيمة (3 * x) – 1 إليها.

ثانيًا، تعرف دالة foo(bar, baz)، حيث يتم فيها حساب قيمة x التي تمثل حاصل ضرب bar و baz، ومن ثم يُرجع مصفوفة من وعود. الوعد الأول يُحل بقيمة x، بينما الوعد الثاني يُحل بنتيجة دالة getY(x).

ثالثاً، تعرف دالة spread(fn) التي تعيد دالة جديدة مرتبطة بالوسيط (bound) تستدعي fn وتمرر لها الوسيط null. هذا يعني أنه عند استدعاء الدالة المُعادة من spread، سيتم تمرير الوسيط null كالمُعد للدالة المُنطوية fn.

أخيرًا، تستخدم Promise.all() لتنفيذ جميع الوعود الموجودة في مصفوفة الوعود التي تم إرجاعها من foo(10, 20)، وبعد حلها بنجاح، يتم استدعاء دالة spread() مع دالة callback التي تقوم بطباعة قيمتي x و y المحلولة من الوعود.

بشكل مبسط، عندما يتم استدعاء spread() مع دالة callback المحددة، يُنشئ المُنظر Function.apply.bind دالة جديدة مرتبطة بالوسيط تنفذ الدالة callback المعطاة لها، وتقوم بتمرير الوسيط null للدالة callback، مما يتيح للدالة callback الوصول إلى قيم x و y المحسوبة بشكل صحيح من الوعود المُستوفاة.

المزيد من المعلومات

بالطبع، دعنا نواصل تحليل وشرح الشيفرة بمزيد من التفاصيل.

عندما يُستدعى spread() ويُمرر إليها الدالة callback التي تستقبل x و y، يتم إنشاء نظر (wrapper) جديد لهذه الدالة باستخدام Function.apply.bind. لكي نفهم كيف يحدث ذلك، دعنا نقوم بتفكيك هذه العملية:

  • Function.apply هي دالة في JavaScript تُستخدم لتنفيذ دالة مع وسيط معين ومصفوفة من الوسائط كمعطيات. يتم تحديد الدالة المراد تنفيذها باستخدام this الذي يتم تمريره لـ apply.

  • bind هو طريقة تُستخدم لربط قيمة معينة بـ this في دالة محددة، مما يؤدي إلى إنشاء نظر جديد للدالة مع this الجديد.

بالتالي، باستخدام Function.apply.bind، نقوم بربط null كقيمة this مع Function.apply، مما يعني أنه عند استدعاء الدالة المنشأة، فإن this سيكون null. ومن ثم، عندما تُستدعى الدالة المُنشأة مع وسيطين (الدالة callback و null)، يُقوم apply بتنفيذ الدالة callback وتمرير null كقيمة this.

بهذه الطريقة، عندما تحل الوعود في Promise.all()، يتم استدعاء الدالة المنشأة من spread()، والتي تقوم بتنفيذ الدالة callback التي تم تمريرها لها، وتمرير null كقيمة this. ونظرًا لأن الدالة callback مربوطة مع null باستخدام Function.apply.bind، فإنها تتمكن من الوصول إلى الوسيطين x و y بشكل صحيح.

لذا، في النهاية، عندما يُستدعى spread()، يُنشئ ويُقيِّد نظرٌ جديد للدالة callback، والتي بدورها تستقبل x و y، وهذا يسمح لنا بالوصول إلى قيم x و y التي تم حسابها من الوعود المُستوفاة بنجاح.

زر الذهاب إلى الأعلى