让Coffeescript在FOR循环中创建局部变量

tpo*_*pow 18 coffeescript

我怎样才能dealViewItem进入FOR循环的范围?目前,dealViewItem的作用域不在其中,我的所有事件监听器都被添加到最后一个dealViewItem中.

  for deal in dealArray
        dealViewItem = dealViewFactory.DealDetail(deal)
        dealViewItem.addEventListener 'click', ->
          dealCart.push(deal.dealId)
          dealViewItem.setAddedToCart()
          btnTakeDeals.setEnabled = true
        dealHolder.add(dealViewItem)
Run Code Online (Sandbox Code Playgroud)

Ale*_*yne 35

这就是do关键字的用途.它将立即运行一个函数,并将任何与其中一个参数同名的局部变量传递给它,从而确保正确的闭包范围.

for deal in dealArray
  do (deal) ->
    dealViewItem = dealViewFactory.DealDetail(deal)
    dealViewItem.addEventListener 'click', ->
      dealCart.push(deal.dealId)
      dealViewItem.setAddedToCart()
      btnTakeDeals.setEnabled = true
    dealHolder.add(dealViewItem)
Run Code Online (Sandbox Code Playgroud)

在这里查看编译版本


do 也可以在循环之外用于自执行函数.

#coffeescript
do ->
  foo = 'bar'

// javascript
(function() {
  var foo;
  return foo = bar;
})();
Run Code Online (Sandbox Code Playgroud)

  • 节省了我几个小时. (3认同)