Это происходит потому, что 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