Това се случва, защото Backbone ви предава препратка към обект, който след това използва повторно.
Както вероятно знаете, събитието mouseenter
е последвано от събитие mouseover
. Нямате манипулатор за mouseover
, така че обикновено няма да ви пука.
Когато възникне събитие mouseenter
, вашият манипулатор се извиква с този обект e
. Това е препратка към някакъв обект в Backbone; регистрирате неговия type
, но след това запазвате препратка към този обект във вашия delay
манипулатор.
След това вашият манипулатор на събития се връща и контролът се връща обратно на Javascript нишката. Събитието mouseover
се задейства. Вашият код може да го игнорира, но Backbone продължава напред и използва повторно обекта, който ви е предоставил, и поставя информацията за събитието mouseover
в него.
След това вашето забавяне изтича и вие използвате e
, за да разберете типа на събитието... сега има всички данни за mouseover
събитие в него, така че това е, което виждате.
Това трябва да бъде полезен урок за всички ни. Първо, имайте предвид, че JS работи с препратки към обекти и ако съхраните обект, който е създаден от нещо различно от вашия код, и след това прекъснете нишката, този обект може да се промени под вас. По същия начин, ако имате методи, които връщат масиви или обекти, знайте, че връщате препратка към този масив или обект... по този начин, ако извикващият код промени съдържанието на въпросния масив или обект, това може да ви обърка; това е особено опасно, когато имате частно поле с публичен гетер. Ако не сте внимателни, можете да предадете препратка, която позволява на кода да променя вътрешността на вашите обекти, без да искате да го правите!
person
Dancrumb
schedule
11.02.2013
e
:_.delay(function (e) { ... }, 500, e);
- person Šime Vidas   schedule 11.02.2013setTimeout
вместо_.delay
, за да проверите дали това поведение е причинено от_.delay
(въпреки че не виждам как би могло да бъде). - person Šime Vidas   schedule 11.02.2013