2012-08-23 55 views
1

我試圖擺脫在這種情況下參考令人討厭的變量聲明,我敢肯定有一種方法來擺脫每個範圍得到隨時待命的「這個」。我只是不知道如何。「這個」在每個範圍之外(jQuery)

$(document).on('click', '.item', function(){ 

    var ref = $(this).attr('data-id'); 

    $.each(t, function(){ 
     if(this.id == ref){ 
      //action 
      return false; 
     } 
    }); 
} 

這不是真的生命或死亡,我只是想清理代碼。

回答

3

有一種方法可以做到這一點:使用自動傳遞給事件處理程序的event引用。

$(document).on('click', '.item', function(e) { 
    $.each(t, function(){ 
     if (this.id == $(e.target).attr('data-id')) { 
      //action 
      return false; 
     } 
    }); 
} 

但是,這不會給你任何東西,除了更多的時間做其他的事情,而代碼運行。 ;)

+0

應該指出,然而,這並不是一個改進,因爲在循環內重複執行jQuery選擇(而不是在循環和保存引用之前僅執行一次)是效率低下且不好的做法。它的編程爲101,除非值每次都會改變,否則不會出現循環。 @ jamietre指出了上面類似的東西。 – nbrooks

+1

正如我指出的(也許是傾斜的)與我的最後一句話...... –

+0

非常真實,只是認爲它需要強調/解釋。真的比你更專注於OP,但我不想進入上面的語義論證;) – nbrooks

1

不知道你的意圖,但如果它是簡單地引用這個原始的元素:

$(document).on('click', '.item', function(){ 
    var that = this; 
    $.each(function(){ 
     // use 'that' however you'd like 
     if ($(that).data().id == 'whatever') ... 
    } 
}); 

你不能「留」在JavaScript範圍,則可以只引用聲明父範圍。

3

其實有些事情你可以做。你可以將你的函數綁定到上下文。既然你已經使用了jQuery,你可以使用jQuery.proxy來接受參數function和context,並將該函數綁定到該上下文並返回一個新函數。

閱讀本這樣你就會明白這一點:http://www.robertsosinski.com/2009/04/28/binding-scope-in-javascript/

然後看看這個:http://api.jquery.com/jQuery.proxy/

希望這有助於有點... :)

+0

+1 - 好主意,只是不完全是我在找的東西。謝謝! – Jonathan