2012-07-26 10 views
6

Mam podstawowe pojęcie o this nie będąc w method, gdy w strict mode opisane here, ale robi się trochę erudycyjny, szczerze mówiąc. Tak więc, bardziej prozaiczne warunki:callback - ścisłe naruszenie

Mam obsługi tak:

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

chcę zmienić go na to:

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

on nie lubi, bo w strict mode ponieważ Używam this poza metodą. Rozumiem.

Jednak muszę mieć myFunction osobny do obsługi, ponieważ (1) jest dołączony do różnych klas/elementów i (2) Używam .off().one('keyup', myFunction) zresetować obsługi one różnych klas w różnych punktach.

W jaki sposób mogę uzyskać oddzielną funkcję zwrotną, nie naruszając działalności firmy this?

+0

Zaakceptowanych odpowiedź na pytanie link do sugestii, aby zamienić instrukcję funkcji na wyrażenie funkcji. Próbowałeś tego? –

+0

Nie używaj trybu ścisłego. – Imdad

+0

Nie ma nic złego w korzystaniu z tego wewnątrz funkcji. Biorąc pod uwagę, że "metody" tak naprawdę nie należą do obiektów (są to po prostu właściwości odnoszące się do funkcji zdefiniowanych _somewhere_ i ewentualnie współużytkowane z innymi obiektami), nie widzę tego, co jest przedmiotem sprzeciwu. – nnnnnn

Odpowiedz

6

uzyskać podstawowe pojęcia na ten temat nie jest w metodzie, gdy w trybie ścisłym ...

Tak, ale jesteś mylące dwóch niepowiązanych rzeczy: trybie ścisłym, a JSLint. Są w dużej mierze niezwiązane ze sobą (z wyjątkiem tego, że JSLint ma opcję wymagającą trybu ścisłego).

Nie ma problemu z kodem w trybie ścisłym. Jest to całkowicie poprawne i odpowiednie (ze względu na to, jak jQuery używa this). Example Jest tam "ścisłe naruszenie" no "ścisłe naruszenie".

JSLint tego nie lubi, ale JSLint nie lubi wielu rzeczy, które są całkowicie poprawne i odpowiednie. JSLint wykrywa kombinację rzeczy, które są powszechnie uznawane za problemy (np. Brakujące średniki) oraz rzeczy, których Douglas Crockford nie lubi z perspektywy w stylu. Inteligentny i dobrze poinformowany Crockford, ale nie wszyscy zgadzają się z jego wyborem stylu.

Narzędzia do linek są bardzo pomocne, stanowią istotną część zestawu narzędzi. JSLint jest mniej pomocny, niż mogłoby być (moim zdaniem), łącząc kwestie substancji z problemami ze stylem (chociaż przyznano, że jest to cienka linia, z JavaScriptem). Możesz rozważyć użycie JSHint, widelca, który daje większą kontrolę nad tym, co sprawdza.

+0

To jest naprawdę pomocne. Używam wbudowanego JSLinta Aptany, a błąd "ścisłe naruszenie" brzmi tak ... autorytatywnie :) – Nick

+0

@Nick: Ack! Rzeczywiście, nie zdawałem sobie sprawy, że to było sformułowane w ten sposób (ale szybkie sprawdzenie na jslint.com to potwierdza). Classic Crockford ... :-) –

1

Nie możesz użyć obiektu zdarzenia zamiast tego?

tj.

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

Przykład: http://jsfiddle.net/gRoberts/cRnb3/

+0

Nie zawsze, mówi docs jQuery: 'event.target' wskazuje najgłębszy (najgłębszy) element, w którym wystąpiło zdarzenie, dlatego' this' może nie być równe 'event.target' jeśli zdarzenie przepłynął z elementu potomnego. –

0

można przeczytać currentTarget o zdarzeniach Obiekt przekazany koryta, jak:

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

Try This

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

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