【问题标题】:Avoiding JSHint "function within in a loop" with Coffeescript closure inside of loop使用循环内的 Coffeescript 闭包避免 JSHint “循环内的函数”
【发布时间】:2014-06-09 09:13:42
【问题描述】:

我正在尝试在 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

【问题讨论】:

    标签: javascript coffeescript closures jshint


    【解决方案1】:

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

    【讨论】:

    • 太棒了,感谢您的解释。我现在正在检查它,并将在测试后更新为接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2021-08-27
    相关资源
    最近更新 更多