2012-07-26 77 views
6

我得到的基本想法this不在methodstrict mode概述here,但它得到了一些博學,說實話。所以,在較爲平淡的術語:jQuery回調 - 嚴格違反

我有一個處理程序,像這樣:

$('.myClass').one('keyup', function() { 
    var $this = $(this); 
    etc etc 
}); 

我想把它改成這樣:

function myFunction() { 
    var $this = $(this); 
    etc etc 
}; 
$('.myClass1').one('keyup', myFunction); 
$('.myClass2').one('keyup', myFunction); etc 

它不喜歡它,因爲在strict mode因爲我在方法外使用this。我明白了。

然而,我需要有單獨的myFunction到處理程序,這是因爲(1)它的附連到各種類別/元素和(2)我使用.off().one('keyup', myFunction)重置one處理程序的各種類的各個點。

那麼,如何在不違反this業務的情況下獲得單獨的回調函數?

+0

接受的問題的答案你鏈接到建議用函數表達式替換函數語句。你嘗試過嗎? – 2012-07-26 08:12:55

+0

不要使用嚴格模式 – Imdad 2012-07-26 08:13:55

+0

在函數內部使用它沒有任何問題。鑑於「方法」並不真正屬於對象(它們只是引用函數定義_somewhere_,並可能與其他對象共享)的屬性,我不明白什麼是反對意見。 – nnnnnn 2012-07-26 08:14:36

回答

6

我得到的基本思路有關此內容的方法在嚴格模式下,當不被...

是的,但你混淆了兩個無關的事情:嚴格模式,JSLint的。它們基本上沒有關係(除了JSLint有一個選項可以要求嚴格模式)。

在嚴格模式下,您的代碼沒有問題。這是完全有效和適當的(因爲jQuery如何使用this)。 Example沒有那裏「嚴格違反」。

JSLint不喜歡它,但JSLint不喜歡很多完全有效和適當的東西。 JSLint檢測到非常廣泛被認爲是問題(如缺少分號)的事物組合,以及道格拉斯克羅克福德從風格的角度不喜歡的事物。克羅克福德的聰明才智,但不是每個人都同意他的風格選擇。

皮棉工具非常有幫助,是工具包的重要組成部分。通過將物質問題與樣式問題混合在一起(儘管JSLint認爲這是一條很好的線,使用JavaScript),JSLint沒有那麼有用(在我看來)。你可能會考慮使用JSHint,它可以讓你更好地控制它檢查的內容。

+0

這真的很有幫助。我使用Aptana的內置JSLint,並且錯誤「strict violation」聽起來如此......權威:) – Nick 2012-07-26 08:20:18

+0

@Nick:Ack!事實上,我沒有意識到它是這樣表述的(但是在jslint.com上的快速檢查證實了這一點)。經典的Crockford ... :-) – 2012-07-26 08:21:40

1

難道你不能使用事件對象嗎?

function myFunction (e) { 
    var $this = $(e.currentTarget); 
}; 

例子:http://jsfiddle.net/gRoberts/cRnb3/

+0

並非總是如此,jQuery文檔說:'event.target'指示事件發生的最深處(最裏面的)元素,因此如果事件發生,this可能不等於event.target已經從後代元素中冒出來了。 – 2015-10-14 15:05:30

0

,你可以讀取事件對象傳遞槽的currentTarget,如:

function myFunction (event) { 
    var $this = $(event.currentTarget); 
    etc etc 
}; 
$('.myClass1').one('keyup', myFunction); 
$('.myClass2').one('keyup', myFunction); etc 
0

試試這個

function myFunction() { 
    var $this = $(this); 
    etc etc 
}; 
var obj= $('.myClass1'); 
obj.myFunction =myFunction ; 

obj.one('keyup', myFunction); 
obj.one('keyup', myFunction); etc