2012-07-24 48 views
18

如何将dealViewItem纳入FOR循环的范围?目前,dealViewItem的作用域在它之外,我所有的事件侦听器都被添加到最后一个dealViewItem中。获取Coffeescript在FOR循环中创建局部变量

for deal in dealArray 
     dealViewItem = dealViewFactory.DealDetail(deal) 
     dealViewItem.addEventListener 'click', -> 
      dealCart.push(deal.dealId) 
      dealViewItem.setAddedToCart() 
      btnTakeDeals.setEnabled = true 
     dealHolder.add(dealViewItem) 
+0

有http://dailyjs.com/2012/07/23/js101-scope/描述JavaScript的作用域,这CoffeeScript的继承的读,然后就可以看到什么做的呢?为什么它的存在,如图在Alexs回答 – 2012-07-24 23:09:42

+1

错误,只是为了明确,JavaScript没有块范围界定,只是全局和功能范围 – 2012-07-24 23:13:48

+0

dailyjs链接已损坏。其他一些链接 - http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html和http://zef.me/blog/2843/javascript-the-scope-pitfall – 2015-11-06 04:58:17

回答

32

这就是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) 

时退房compiled version here


do也可以循环外用于自我执行功能。

#coffeescript 
do -> 
    foo = 'bar' 

// javascript 
(function() { 
    var foo; 
    return foo = bar; 
})(); 
+3

节省了我的时间。 – woodardj 2015-03-05 04:43:53

+0

同上。此外,伟大的工作@woodardj。 – 2015-04-22 16:00:32