کاربرد hitch در Dojo

در لایبراری  دوجو  ، در برخی  از  سمپل ها ، ممکن است  با  فانکشن یا تابع  hitch    برخورد کرده باشد.اما  کاربرد  این  متد چیست؟

ابتدا بهتر است بفهمیم  که  این hitch   چه  مشکلی  را بر طرف میکند.

به مثال  زیر  توجه کنید

require(["dojo/query", "dojo/domReady!"],
    function(query) {

        var myObject = {
            foo: "bar",
            myHandler: function(evt){
                                      alert("The value of 'foo' is " + this.foo);
                                     }
                        };

        //    later on in the script:
        query(".myNodes").forEach(function(node){
            node.onclick = myObject.myHandler;
        });

});

یک آبجک داریم  به نام myObject ( دقت کنید که آبجکت  در جاوا اسکریپت  در واقع  یک  function  میباشد).

این آبجک  دارای  یک متد به نام myHandler  و  یک  متغیر به  نام foo میباشد.

اما  این قسمت 

 query(".myNodes").forEach(function(node){
            node.onclick = myObject.myHandler;
        });

تو این قسمت  هر  Element   ای که  دارای  css  کلاسی  به نام  myNodes  باشه  رو  پیدا میکنه  و  اگر  روی  هر  کدوم  از این  element   های  HTML  کلیک  کنیم ، myHandler    رو  صدا میزنه.

دقت کنید که  myHandler   ،  تو آبکت  myObject  تعریف شده..و داخل myHandler    قراره  یه  alert   به نمایش  در بیاد..دقت کنید داخل myHandler ، ما چنین  چیزی  رو    تعریف کریم

alert("The value of 'foo' is " + this.foo);

  خوب ما انتظار  داریم که   مقدار  "The value of 'foo' is  bar"  رو  نمایش  بده..اما  این طور  نیست..چیزی  که ما خوایم  دید  =" The value of 'foo' is undefined ".

اما  چرا؟؟  چرا  undefined ؟   مگه   نباید  به جای   this.foo     ،  مقدار  "bar" رو نشون بده؟؟

اینجاست که  بحث  execution context  مطرح میشه.

ببنین  درسته که  تو خود  آبجکت myObject ، this.foo   داره  به  متغیر  foo ،  تو این متد  اشاره میکنه  ...اما  باید این نکته رو هم  در نظر بگیرین  که  myHandler   داره  کجا  اجرا میشه..

بله  myHandler   داره  روی  element  های  html  اجرا میشه  که چیزی  به نام  foo   ندارد.. پس  خروجی The value of 'foo' is undefined   درسته.

فانکشن  lang.hitch    این  مشکل  رو حل  میکنه.

این متد تو  ماژول   ["dojo/_base/lang"]    تعریف  شده  و در  واقع  میتونیم با این متد  بگیم  که   this   باید  به چی  اشاره  کنه .

اگر مایل  باشین میتونین  یکم در باره  scop  و  execution context  تحقیق کنید .مفهوم  بیشتر  جا میوفته براتون... اما در همین حد هم  بدونین  که  چنین  مشکلاتی  رو  حل میکنه.

lang.hitch(myObject, myObject.myHandler)

در واقع  this    رو  برای  اجرا  مشخص میکنه.

امید وارم    بدردتون   بخوره  و  تو  پروژه  ها بتونین   استفاده کنین.

در پناه خدا  باشین