Ich denke, dies könnte ein Duplikat von Strict Violation sein, das dieses Schlüsselwort verwendet und das Modulmuster enthüllt
Ich habe diesen Code:
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);
}
Und JSHINT (JSLINT) beschwert sich. Es heißt "Strikte Verletzung". für die hervorgehobene Zeile:
Ist es Function.call()
irgendwie unangemessen, die Instanz zu verwenden und dann darauf zu verweisen?
Wird dies als schlechter Stil angesehen?
javascript
jslint
strict
jshint
Cheeso
quelle
quelle
this
. Ich habe keine Ahnung, warum JSLint es als strikte Verletzung bezeichnen würde, aber ich weiß, dassthis
es sichundefined
im strengen Modus befindet , wenn Sie den Wert einer Funktion nicht definieren . Klar definieren Siethis
, also sollte es kein Problem sein."-W040":true
in der Konfiguration json ignorieren , aber da json keine Kommentare hat, können Sie niemandem sagen, warum es dort ist.Antworten:
JSHint sagt "Mögliche strikte Verletzung", weil Sie verwenden
this
in etwas verwenden, das, soweit es das kann, keine Methode ist.In nicht-striktem Modus Berufung
gotoPage(5)
binden würdethis
auf das globale Objekt (window
im Browser). Im strengen Modusthis
wäreundefined
, und Sie würden in Schwierigkeiten geraten.Vermutlich wollen Sie diese Funktion mit einem gebundenen
this
Kontext aufrufen , z . B.gotoPage.bind(myObj)(5)
odergotoPage.call(myObj, 5)
. In diesem Fall können Sie JSHint ignorieren, da Sie keine Fehler generieren. Es sagt Ihnen jedoch, dass Ihr Code für jeden, der ihn liest, unklar ist, da die Verwendungthis
in etwas, das offensichtlich keine Methode ist, ziemlich verwirrend ist. Es wäre besser, das Objekt einfach als Parameter zu übergeben:quelle
this
Fall istundefined
, ist das eigentliche Problem nicht nur ein strikte Verletzung des Modus . Sie sollten besser eine Warnung geben, die besagt, dass sie sichthis
möglicherweiseundefined
im "strengen Modus" befinden und zu einemTypeError
(oder etwas) führen.event.currentTarget
stattthis
..jshintrc
, um diese Prüfung zu deaktivieren?/* jshint validthis: true */
Sie diese Option, wenn Sie nur ein Paar haben und nicht für jeden Fall ändern möchten.Ich habe diese Nachricht für eine Funktion erhalten, die nicht mit einem Großbuchstaben begann.
quelle
Something
es sich aufgrund des Kapitals S um einen Konstruktor handelt, und daher mit using bezeichnet werden solltenew
. Dies definiertthis
, dass es sich um ein neues Objekt handelt, das auf "Something.prototype" basiert. Es ist höchstwahrscheinlich auf diese Annahme zurückzuführen, dass die mögliche Warnung vor strengen Verstößen nicht ausgelöst wird.Wenn Sie die Funktion als Variable deklarieren, anstatt die Standardfunktionsdeklaration zu verwenden, kennzeichnet jshint dies nicht als strikte Verletzung. Sie können also Folgendes tun:
quelle
Wenn Sie versuchen, eine Methode zu implementieren, möchten Sie möglicherweise stattdessen den Prototyp zuweisen:
JSHint warnt nicht, wenn die Funktion zugewiesen wird.
quelle
ClassName.prototype.myMethod = myMethod;
, dann definiert die Methode unten. Sie erhalten immer noch eine Fehlermeldung, obwohl myMethod korrekt gebunden ist.