2015-08-14 75 views
0
var that = this; 

for(var i=0;i<x;++i){ 
// some code 
events={ 
    click: function(event){ 
    that.doClick(event,this); 
} 
} 
} 

現在有了上面的代碼,我得到了JShint錯誤「不要在循環中創建函數」。將事件傳遞給另一個函數

要解決上述錯誤,我現在做這個

var that = this; 
    function clickHandler() { 
       return function() { 
        that.doClick(this); 
       }; 
      } 

for(var i=0;i<x;++i){ 
// some code 
events={ 
    click: clickHandler() 
} 
} 

這個位子?如果是的話,我怎麼能通過事件點擊事件clickHandler然後doClick功能

+0

你的第一塊代碼與第二塊代碼沒有區別,除非你不通過'clickHandler' - 你執行它並將結果賦給'click'。 – tymeJV

+0

如何將事件傳遞給第二種情況下的ClickClick? – anand

回答

0

不,它不好。在循環內創建函數的問題在於,您在每次迭代時都會創建函數的新副本。

在第二個代碼中,每次迭代時都會調用clickHandler,每次都會返回一個不同的函數副本。所以它仍然是同樣的問題。

取而代之的是,更好的辦法是循環之前創建函數僅一次,裏面引用它:

var that = this; 
function clickHandler(event) { 
    that.doClick(event, this); 
} 
for(var i=0; i<x; ++i){ 
    var events = {click: clickHandler}; 
} 

然而,由於events似乎並不依賴於i,你可以在外面過移動它:

var that = this, 
    events = {click: function(event){ 
     that.doClick(event, this); 
    }}; 
for(var i=0; i<x; ++i){ 
    /* Use `events` here */ 
} 
+0

現在在that.doClick上獲得另一個jshint警告(event,this); 「可能嚴格排除」 – anand

+0

@ Alien01 jshint不知道你只會使用該函數作爲方法,所以它警告'this'的值將是非嚴格模式下的全局對象,並且在嚴格模式下是未定義的。您可以在'clickHandler'內添加'/ * jshint valwidthis:true * /'來忽略該警告,或者將其命名爲'ClickHandler'以使jshint認爲它是一個構造函數。或者,使用我的第二個代碼。 – Oriol

相關問題