هل هناك أي فائدة من تعريف اسم الدالة في "var new_function=function name(){};" في جافاسكريبت؟


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

var some_function = function name(args){
//do stuff
};

الكود نفسه يعمل، لكن كنت أتساءل فقط إذا كان من المقبول إزالة "name" لجميع الدوال التي أجدها بهذه الطريقة (لأن ذلك لا يكسرها في المشكلة الأخرى التي تحلل جافا سكريبت الخاص بي) أو إذا كان يمكن أن يكون له أي استخدام لا أستطيع رؤيته.

إزالة "الاسم":

var new_function = function(){/*do stuff*/};

ملاحظة: الملف الأصلي الذي حدث فيه ذلك أولاً كان في jquery-1.6.4.js في:

jQuerySub.fn.init = function init( selector, context ) {
    if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
        context = jQuerySub( context );
    }

    return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
};

شكراً على أي مساعدة مقدماً :)

الإجابة رقم 1

المعرف name لتعبيرات الدالة، متاح فقط داخل الدالة نفسها.

في مثال jQuery الخاص بك، لم يتم استخدام المعرف init حتى، لذلك أعتقد أن الميزة الوحيدة لتسمية الدالة هي لأغراض التصحيح، سيكون بمقدور المصحح عرض اسم الدالة لك في سلسلة طويلة من الاستدعاءات.

قارن :

ضد

توجد عيوب، خطأ قائم منذ فترة طويلة في IE <=8 يجعل تعبيرات الدوال المسماة تسرب معرف الاسم إلى نطاقها المحيط، علاوة على ذلك، يؤدي إلى إنشاء جسمين للدالة، على سبيل المثال:

var foo = function bar() {}; 

typeof bar; // "function" on IE
foo === bar; // false, two different objects

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

jQuerySub.fn.init = (function () {
  function init( selector, context ) {
    //...
  }

  return init;
})();

وبطرق مشابهة أخرى، أوصي بأن تتحقق من المقال التالي:

  • وظيفة مسماة مبسطة