partial application فى الجافاسكربت


السلام عليكم و رحمه الله تعالى و بركاته

قد شرحت فى الموضوع السابق currying لكن من عيوبه انه لابد من ملىء عبارات الوظيفه بالترتيب😦 ، إنما تطبيق وظيفه جزئيا partially applying function يمكنك ملىء اى عباره من عباراتها ليس بالترتيب و اعطاء العبارات الناقصه القيمه undefined ، ثم استدعائها فيما بعد بعد اكمال العبارات ، هذه التطبيقات الجزئيه موجوده فى العديد من اللغات لكن oliver steel هو اول من ادرجها فى جافاسكربت خلال مكتبته functional.js ،  يمكننا زياده الوظيفه partial إلى الصنف Function كالاتى – سأشرحه بالتفصيل :

Function.prototype.partial = function(){
    var fn = this;
    var args = Array.prototype.slice.call(arguments);
    return function(){ // code of the new generated function
        var arg = 0;
        for(var i=0; i<args.length && arg<arguments.length; i++){
            if(args[i]==undefined) args[i]=arguments[arg++];
        }
        return fn.apply(this,args);
    }
}

قمت بإضافه وظيفه جديده بإسم partial إلى Function.prototype حتى ترثها كل الوظائف وقت التشغيل :

Function.prototype.partial = function(){...}

قمت بعمل مرجع للوظيفه الحاليه التى تستدعى الوظيفه partial :

var fn = this;

قمت بتحويل العبارات التى تمرر للوظيفه partial من collection إلى array و قمت بتخزينها فى المتغير args :

var args = Array.prototype.slice.call(arguments);

قمت بإرجاع وظيفه جديده ناتجه عن استدعاس الوظيفه partial :

return function(){...}

داخل الوظيفه الجديده قمت بفحص العبارت التى مررت للوظيفه partial و كانت قيمتها undefined ، حيث اقوم بتبديلها بالعبارت التى مررت للوظيفه الجديده – هذه القطعه اخذت منى وقت كبير حتى فهتمها ، اكيد انت اذكى منى ستفهمها سريعا :

var arg = 0;
for(var i=0; i<args.length && arg<arguments.length; i++){
    if(args[i]==undefined) args[i]=arguments[arg++];
}

ثم قمت بتمرير العبارات القديمه بعد ملىء الفراغات التى بها إلى الوظيفه الاصليه – هذا هو ناتج استدعاء الوظيفه الجديده الناتجه من function.partial :

return fn.apply(this,args);

يمكننا إستخدام الوظيفه partial كما توضح الامثله التاليه :

var delay = setTimeout.partial(undefined,2000);
delay(function(){alert("grrrr!")}); // alert after 2 seconds

var bindClick = document.body.addEventListener.partial("click",undefined,false);
bindClick(function(){
     alert("click handler bound to body");
});

function num(a,b){
    alert(a+b);
}
var pnum = num.partial(undefined,10);
pnum(20); //30

الأوسمة:

3 تعليقات to “partial application فى الجافاسكربت”

  1. almhajer Says:

    يعطيك العافييه بارك الله فيك والله اابداع في الاسلوب والتفاني صراحة الاجانب عندهم افكار ولااحلى شكلهم بيفكرويشغلو المخ باشياء ماتخطربافكارنا الي ماهي مشتغلة الله بيفتح عليك اخي وانا باحر الاشواق لدوسك القدمة الله بيرزقك العفةوالعفو والعافية وقل ربي زدني علما

  2. mostafa farghaly Says:

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

  3. almhajer Says:

    صحيح كماذكرت السبب الرئيسي هو القراءة كماذكرت واعجب من نفسي نحن امة اقراء واول كلمة نزلت على رسولنا صلى الله عليه وسلم اقراء اما عن سؤالك عن كم ساعة يوميا حوالي اربع ساعات المشكلة الرئيسية اني لااتقن اللغة الانكليزية بشكل متقن يعني 1/4 المهم الاتكال على الله والاخذ بالاسباب كما ذكرت وجهدك ان شاء الله مارح بيضيع هباء الله يبارك فيك والله كلمة شكرا او غيرها ماتكفي بس روح ياشيخ الله بيوفقك استنا الدرس تلو الاخر لاني متوقع رح بيسوي تغير دينميكي ان شاء الله ان اقراء دروسك واراجع ماكتبه جون رسنغ الله يبارك فيك وارجو من الله ان يسدد خطاك وكان اتمنى من الله انه يكون بدل المدونة موقع لانه دروسه من ذهب على كل حال سلمت يداك وحفظ الله والديك واتمنى بدل الدرس كل يوم اتحط عشرة طبعا امزح معاك لانو عندك دراسة الله بيوفقك ويبارك البطن الي حملتك وتقبل خالص شكري وامتناني وكما قا ل سيدنا علي بن ابي طالب من علمني حرفا كنت له عبدا بالتوفيق والله يجزاك الف خير

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s


%d مدونون معجبون بهذه: