2012-03-15 79 views
3

我正在慢慢地瞭解越來越多的閉包,並且下面的代碼有效。我想知道是否有更簡單/更好的方法來完成我在這裏要做的事情。這是爲我的目的而關閉的正確方法嗎?

在下面的代碼中,this僅指一個對象,它具有一個sections屬性,該屬性是一個數組。我遍歷這個數組,並綁定每個section的每個el屬性(DOM元素)的懸停事件。我提供給hover()方法回調是在封閉的用武之地。主要this對象有兩種方法.sectionMouseenter().sectionMouseleave()是那些獲得取決於事件類型(由e.type在我的代碼表示)是mouseentermouseleave調用。作爲一個參數,當前部分被傳遞給這些方法。當然,一個for循環的迭代在JavaScript中沒有可變範圍,因此封裝變量的引用是必要的。

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 2012-03-15 14:00:23

+0

+1以這種方式更具可讀性 – 2012-03-15 14:01:12

+0

+1。謝謝,這正是我問這個問題的原因。我打算將它打開一會兒,看看可能會有什麼其他響應。 – maxedison 2012-03-15 14:17:00

相關問題