2012-07-24 5 views
18

dealViewItemをFORループのスコープに入れるにはどうすればよいですか?現在、dealViewItemはそのスコープ外にスコープされ、すべてのイベントリスナーが最後のdealViewItemに追加されます。FORループのローカル変数を作成するためのCoffeescriptの取得

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

はCoffeeScriptのが継承JavaScriptのスコープを記述するhttp://dailyjs.com/2012/07/23/js101-scope/の読み取りを持って、あなたが示すように行うには、なぜそのそこに何を見ることができますAlexs Answer –

+1

err、明示的に、javascriptにはブロックスコープがありません。グローバルスコープと関数スコープ –

+0

dailyjsのリンクが壊れています。他のリンク - http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.htmlとhttp://zef.me/blog/2843/javascript-the-scope-pitfall –

答えて

32

これはdoのキーワードです。それはすぐに関数を実行し、引数の1つと同じ名前のローカル変数が渡され、適切なクロージャスコープが確保されます。

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

+0

同上。また、素晴らしい仕事@ woodardj。 –

関連する問題