التوابع المعرفة والتوابع الدالة في جافاسكريبت

هنالك الكثير من المبرمجين الآن لا يميزون بين التوابع المعرفة ( Function Declarations) والتوابع الدالة ( Function Expressions) وقمت من فترة ببحث عن هذا الموضوع و هذا ماتوصلت إليه. حاولت تبسيطه، أرجو أن يكون مفيداً لكم.

التوابع المعرفة والتوابع الدالة في جافاسكريبت

ماهي التوابع المعرفة؟

هي توابع معرفة بأسماء دون أن يتم إسنادها إلى متحول. من السهل تصورها على أنها مثل المتحولات في جافاسكريبت غير أنها لاتبدأ بـ var وإنما تبدأ بـ function.


function bar() {
    return 3;
}

اسم التابع معرف ضمن مجاله وضمن المجال الأب له أو المجال الأعلى منه لكي نستطيع استدعاءه.


function bar() {
    return 3;
}

bar() //3
bar //function

ماهي التوابع الدالة؟

هي توابع تعرف ضمن كود برمجي كبير ومعظم الأحيان تسند إلى متحول، وهذه التوابع يمكن أن تعطى اسماً ويمكن أن تكون بدون اسم، تسمى عندها التوابع المجهولة (Anonymous Functions).


//تابع مجهول
var a = function() {
    return 3;
}

//تابع مسمى
var a = function bar() {
    return 3;
}

//تابع يستدعي نفسه ذاتيا
(function sayHello() {
    alert("hello!");
})();

من الملاحظ أن التوابع الدالة لا تبدأ بكلمة function كما رأينا، فإما أن تسند لمتحول أو أن تغلف بأقواس لتستدعى ذاتياً،  والتابع المسمى في التوابع الدالة غير معرف خارج مجاله هذا يعني أنه في المثال السابق اذا أردنا ان ننادي التابع ()bar، سيظهر لنا خطأ يقول ان bar غير معرف (is not defined).

لنرى المثال التالي


function foo(){

    function bar() {
        return 3;
    }

    function bar() {
        return 8;
    }

    return bar();
}

alert(foo());

هل توقعتم ما سيرد المثال السابق؟ سيرد 8، بما أن التابع ()bar أعيد تعريفه وأصبح يرد قيمة اخرى.

ولكن ألا توقف return التنفيذ؟ في جافاسكريبت وفي مرحلة التنفيذ في حال تشارك تعريف التابع حيز المتحولات للتابع الأب فإن return ترد القيمة للتابع الأب دون أن توقف تنفيذه.

حسناً، وشكراً على الإيضاح ولكن أين أستخدم كلاً منهما؟

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

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

محمد نورس البغدادي

من مواليد دمشق بدأ عمله في دمشق كمطور مواقع انترنت ثم انتقل الى دبي. يعمل كمطور واجهات للمواقع الالكترونية ومطور تطبيقات للاجهزة اللوحية.

مواضيع الكاتبموقع الكاتب

لمتابعة الكاتب:
TwitterFacebookLinkedInGoogle Plus

أضف تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *