2014-02-16 36 views
2

我使用的IDE(Cloud 9)包含JSHint,當它檢測到錯誤時給我一個警告。作爲一個原則,我嘗試糾正我的代碼以糾正這些錯誤。還有一個,我現在有我不能看到周圍的方式:爲什麼JSHint提醒我在回調函數中使用'this'?

$("#component-manager tr:not(.edit-component) td").on("click", function() { 
    if ($(this).index() !== 0) { 
     var checkbox = $(this).parent().find("input[name=component-selected]"); 
     checkbox.trigger("click"); 
    } 
}); 

此代碼給我一個警告:「在回調函數‘this’使用」。

我有兩個問題:

  1. 我應該怎麼做才能提高我的代碼,並擺脫這一警告的。
  2. 爲什麼在回調函數中不使用this更好的做法(因爲這是JSHint試圖推廣的)?
+0

我會考慮在IDE中的錯誤或配置錯誤。在像這樣的jQuery回調中使用'this'是明確和熱情的鼓勵。 – Pointy

+0

JShint不給我任何警告或錯誤。 –

+1

您可以使用'function(e){$(e.target)...'而不是'function(){$(this)...' – lordvlad

回答

4

您的代碼沒有任何問題,也沒有任何「更好」的方式來編寫代碼。這只是jsHint所做的事情,也許僅僅是因爲有些人在其他類型的回調中使用this時會犯錯誤。

有一條評論,你可以插入你的代碼,這將告訴js提示忽略這個特定的用途。我會去看看,如果我找到它,並將其添加到我的答案,如果我找到它。對於jsHint:http://www.jshint.com/docs/options/#validthis,您可以使用validthis選項來忽略特定功能的此警告。

我還沒有嘗試過自己,但根據文檔,你可以添加這功能:

/* jshint validthis: true */ 

或者,配置文件可以用jshint被用來改變默認此選項(你必須弄清楚在IDE中如何做到這一點)。

1

該代碼沒有問題,您的IDE只是不聰明。在我的IDE中,函數總是返回一些東西,但由於我使用了條件if和else,它給了我一個警告,可能沒有東西會被返回並添加'void'(使用XCode)。做我所做的事,並忽略它。

如果你的錯誤極端,而且這只是發生在使用this,你可以做什麼lordvlad說,用function(e){e.target取代$(this)

+0

我現在正在做你的建議。它並沒有太多的bug,但是正如@OregonTrail所建議的那樣,我認爲這是一個更好的解決問題的方法。 – microbug

+0

@ jfriend00我想這是一個效率較低的機制:我可以忍受這個錯誤! (改變答案...) – microbug

1

這來自通常錯誤實施的this that模式。一個例子見this question

通常有更好的方法來獲得對所討論對象的引用。在這種情況下,您需要爲回調函數聲明一個參數,並明確引用該事件目標。

$("#component-manager tr:not(.edit-component) td").on("click", function(event) { 
    if ($(event.target).index() !== 0) { 
     var checkbox = $(event.target).parent().find("input[name=component-selected]"); 
     checkbox.trigger("click"); 
    } 
}); 
相關問題