متى يجب استخدام التكرار والوظائف الجزئية في جافاسكريبت


قرأت هذا المنشور على Dr. Dobb's عن الكوريينغ والدوال الجزئية في جافا سكريبت. يبدو مفيدًا، لكنني أتساءل (كمطور متقطع في جافا سكريبت) إذا كانت هناك حالات قياسية يتم استخدام هذا فيها بانتظام؟

الإجابة رقم 1

بادئ ذي بدء، شخصياً لا أنصح بالـ currying في 99٪ من الحالات. يمكن أن يجعل الكود غير قابل للقراءة بسهولة إذا تم استخدامه بشكل غير صحيح.

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

الوضع الثاني سيكون عندما، على سبيل المثال، يكون لديك دالة تأخذ ثلاث وسائط. عنصر DOM، واسم السمة وقيمتها. يمكن تحويل هذا إلى دالة تحويل (currying) يمكنك تهيئتها بالعنصر المناسب، ثم كل تنفيذ لاحق سيضبط سمة للقيمة التي ترغب بها. قد يكون مفيدًا في الحالات التي تعتمد فيها السمات على شروط متعددة.

الإجابة رقم 2

سيناريو شائع جدًا هو عند إنشاء معالجات الأحداث.

على سبيل المثال، لنفترض أن لديك مستندًا يحتوي على العديد من الروابط مثل:

    <a href="http://someurl.com/example">link</a>

قل إنك تريد أن يجتاز جافاسكريبت كل هذه الروابط ويجعلها تعرض مربع حوار يقول "أنت الآن ذاهب إلى: " عند النقر. في هذه الحالة، يمكنك استخدام كود مثل:

    var links = document.getElementsByTagName("a"), len = links.length;
    for (var n = 0; n < len; ++n) {
        links[n].onclick = window.alert.bind(null, "You are now going to: " + links[n].innerText);
    }

Function.prototype.bind() (الذي أستخدمه على window.alert()) مشابه جدًا لـ partialApply() المستخدمة في المقالة التي قمت بربطها.

بينما هذا المثال نفسه ليس عمليًا جدًا، إلا أنه ليس بعيدًا عن مهمة أكثر شيوعًا: عرض مربع تأكيد عندما ينقر المستخدم على رابط يؤدي إلى موقع ويب تابع لجهة خارجية.

الآن، بدلاً من window.alert.bind(...)، كان بإمكاننا استخدام دالة مجهولة:

    links[n].onclick = (function(text) {
        return function() { window.alert(text); };
    })("You are now going to: " + link[n].innerText);

ومع ذلك، هذا الكثير من الأكواد! معظم أمثلة الكاريينج يمكن "تبسيطها" بهذه الطريقة، لذا فعادةً ما تكون مجرد اختصار، وإن كان اختصارًا مفيدًا جدًا.