避免JSHint"在循环中运行"循环内有Coffeescript闭包

时间:2014-06-09 00:13:06

标签: javascript coffeescript closures jshint

我正在尝试在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),但是在第一个obj之后它就疯了。

如果你需要测试一些想法,我为它设置了一个JSBin,http://jsbin.com/qimor/2/edit

1 个答案:

答案 0 :(得分:2)

在这种情况下,您实际上并不需要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很聪明,可以识别。