避免 JSHint "function within in a loop"与循环内的 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

在这种情况下实际上不需要do。你对bindIt的调用已经打破了你的引用,所以你可以直接说:

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

,问题就解决了。

更新的演示:http://jsbin.com/xebudowo/1/edit

同样,do -inside-a-loop的通常形式是将循环变量传递给do生成的匿名函数:

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

应该产生标准的JavaScript习语:

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

,假定JSHint足够聪明可以识别

最新更新