2012-03-15 5 views
3

私は徐々に閉鎖を理解しており、次のコードが機能します。私がここでやろうとしていることを達成するためのより簡単な方法があれば、私は思っています。これは私の目的のために閉鎖する正しい方法でしたか?

以下のコードでは、thisは、単にオブジェクトであり、配列であるsectionsというプロパティを参照しています。私はこの配列をループし、各プロパティ(DOM要素)のホバーイベントにそれぞれsectionのものをバインドします。閉鎖の出番私はhover()方法に供給するコールバックです。メインthisオブジェクトには二つの方法.sectionMouseenter()と(私のコードでe.typeによって表される)イベントタイプがmouseentermouseleaveであるかに応じて呼び出されます.sectionMouseleave()を持っています。引数として、現在のセクションがこれらのメソッドに渡されます。もちろん、forループの反復にはJavaScriptでは可変スコープがないため、section変数の参照をカプセル化するにはクロージャが必要です。

for (var i = this.sections.length - 1; i >= 0; i--) { 
     var section = that.sections[i]; 
     section.el.hover(
      (function(section){ 
       return function(e){ 
        that['section' + e.type.capitalize()](section); 
       } 
      })(section) 
     ); 
    }; 

この閉包を書いたのは「正しい」方法ですか、それとも良い方法ですか?

答えて

6

オンザフライでは関数を構築しませんが、forループの外側に配置してください。

var sections = this.sections; 

function dummy(section) { 
    return function(e) { 
     that['section' + e.type.capitalize()](section); 
    } 
} 

for (var i = sections.length - 1; i >= 0; i--) { 
    section.el.hover(dummy(sections[i])); 
} 
+0

これは本当に良いアドバイスです。そしてマックスはあなたのロジックを本当に簡単にすることができます。 – Joe

+0

+1このようにしてはるかに読みやすくなります –

+0

+1。ありがとう、これはまさに私がこの質問をした理由です。もう少し反応が出るかもしれないかどうかを少し見開いておきます。 – maxedison

関連する問題