Myślę, że może to być duplikat Strict Violation używający tego słowa kluczowego i ujawniający wzorzec modułu
Mam ten kod:
function gotoPage(s){
if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);}
}
function pageChange(event, sorter) {
var dd = event.currentTarget;
gotoPage.call(sorter, dd[dd.selectedIndex].value);
}
JSHINT (JSLINT) narzeka. Jest tam napisane „Surowe naruszenie”. dla podświetlonej linii:
Czy korzystanie z Function.call()
instancji, a następnie odwoływanie się do niej, jest w jakiś sposób nieodpowiednie?
Czy to jest uważane za zły styl?
this
. Nie mam pojęcia, dlaczego JSLint nazwałby to Strict Violation, ale wiem, że jeśli nie zdefiniujeszthis
wartości funkcji, będzie onaundefined
w trybie ścisłym. Najwyraźniej definiujeszthis
, więc nie powinno to stanowić problemu."-W040":true
w json config, ale ponieważ json nie ma komentarzy, nie można nikomu powiedzieć, dlaczego tam jest.Odpowiedzi:
JSHint mówi „Możliwe ścisłe naruszenie”, ponieważ używasz
this
wewnątrz czegoś, co, o ile może stwierdzić, nie jest metodą.W trybie nieścisłym wywołanie
gotoPage(5)
wiązałoby sięthis
z obiektem globalnym (window
w przeglądarce). W trybie ścisłymthis
byłobyundefined
i wpadłbyś w kłopoty.Przypuszczalnie masz na myśli wywołanie tej funkcji z powiązanym
this
kontekstem, np .gotoPage.bind(myObj)(5)
LubgotoPage.call(myObj, 5)
. Jeśli tak, możesz zignorować JSHint, ponieważ nie wygenerujesz żadnych błędów. Ale mówi ci, że twój kod jest niejasny dla każdego, kto go czyta, ponieważ użyciethis
wewnątrz czegoś, co nie jest oczywiście metodą, jest dość zagmatwane. Lepiej byłoby po prostu przekazać obiekt jako parametr:źródło
this
tak się stanieundefined
, rzeczywisty problem nie jest tylko ścisłym naruszeniem trybu . Lepiej zrobiliby, ostrzegając, żethis
może to mieć miejsceundefined
w „trybie ścisłym”, prowadząc doTypeError
(lub czegoś).event.currentTarget
zamiastthis
..jshintrc
aby wyłączyć to sprawdzanie?/* jshint validthis: true */
jeśli masz tylko parę i nie chcesz się zmieniać w każdym przypadku.Otrzymałem tę wiadomość dla funkcji, która nie zaczynała się wielką literą.
źródło
Something
jest konstruktorem ze względu na duże S i tak powinno być nazywane usingnew
. Robiąc to, definiujethis
się jako nowy obiekt oparty na `Something.prototype '. Najprawdopodobniej wynika to z tego założenia, że nie powoduje to ostrzeżenia o możliwym ścisłym naruszeniu.Jeśli zadeklarujesz funkcję jako zmienną zamiast używać standardowej deklaracji funkcji, jshint nie oznaczy tego jako ścisłe naruszenie. Możesz więc wykonać następujące czynności -
źródło
Jeśli próbujesz zaimplementować metodę, możesz zamiast tego przypisać ją do prototypu:
JSHint nie ostrzega, gdy funkcja jest przypisywana.
źródło
ClassName.prototype.myMethod = myMethod;
, a następnie zdefiniował metodę poniżej. Nadal pojawia się błąd, mimo że myMethod jest poprawnie powiązany.