我试图在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足够聪明可以识别