Избегание функции JSHint внутри цикла с закрытием Coffeescript внутри цикла

Я пытаюсь инициировать прослушиватели событий в массиве связанных элементов объектов в Coffeescript. Это работает так же, как я это делаю, но JSHint (справедливо) жалуется на создание функции внутри цикла.

Я немного поиграл, но не вижу способа обойти это. Я всегда могу отключить это сообщение об ошибке, но оно существует не просто так. Есть идеи, как это сделать без анонимной функции внутри цикла?

bindHover = (obj) ->
  for obj in objArray
    if obj.el
      do () -> bindIt(obj)

bindIt = (obj) ->
  obj.el.addEventListener('mouseenter', (event) -> obj.on() )
  obj.el.addEventListener('mouseleave', (event) -> obj.off() )

Я пробовал только do bindIt(obj), но после первого объекта он вылетает.

Я настроил для него JSBin, если вам нужно проверить некоторые идеи, http://jsbin.com/qimor/2/edit


person andrew.carpenter    schedule 09.06.2014    source источник


Ответы (1)


На самом деле вам не нужен do в этом случае. Ваш вызов bindIt уже ломает ссылку для вас, так что вы можете просто сказать:

bindHover = (obj) ->
  bindIt(obj) for obj in objArray when obj.el

и проблема уходит.

Обновленная демонстрация: http://jsbin.com/xebudowo/1/edit.

Кроме того, обычная форма do внутри цикла заключается в передаче переменных цикла анонимной функции, которую производит do:

for obj in objArray when obj.el
  do (obj) -> ...
  #---^^^

Это должно привести к стандартной идиоме JavaScript:

for(...) {
  (function(obj) { ... })(obj)

что, по-видимому, JSHint достаточно умен, чтобы распознать.

person mu is too short    schedule 09.06.2014
comment
Потрясающе, спасибо за объяснение. Я проверяю это сейчас и обновлю с принятым после тестирования. - person andrew.carpenter; 09.06.2014