我正在尝试在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
答案 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很聪明,可以识别。