Ich denke, dass dies ein Duplikat von Strict Violation sein kann, das dieses Schlüsselwort verwendet und das Modulmuster aufdeckt
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 "Strenge Verletzung". für die hervorgehobene Zeile:
Ist meine Verwendung von Function.call()
und das Verweisen auf die Instanz irgendwie unangemessen?
Ist das ein schlechter Stil?
JSHint sagt "Möglicher strenger Verstoß", weil Sie this
innerhalb von etwas verwenden, das, soweit es erkennbar ist, keine Methode ist.
Im nicht strengen Modus würde der Aufruf von gotoPage(5)
this
an das globale Objekt (window
im Browser) binden. Im strikten Modus wäre this
undefined
und Sie würden in Schwierigkeiten geraten.
Vermutlich meinen Sie, diese Funktion mit einem gebundenen this
-Kontext aufzurufen, z. gotoPage.bind(myObj)(5)
oder gotoPage.call(myObj, 5)
. In diesem Fall können Sie JSHint ignorieren, da Sie keine Fehler generieren. Aber es sagt Ihnen, dass Ihr Code für jeden, der ihn liest, unklar ist, denn die Verwendung von this
in etwas, das offensichtlich keine Methode ist, ist ziemlich verwirrend. Es ist besser, das Objekt einfach als Parameter zu übergeben:
function gotoPage(sorter, s) {
if (s <= sorter.d && s > 0) {
sorter.g = s;
sorter.page((s - 1) * sorter.p.size);
}
}
function pageChange(event, sorter) {
var dd = event.currentTarget;
gotoPage(sorter, dd[dd.selectedIndex].value);
}
Ich hatte diese Nachricht für eine Funktion, die nicht mit einem Großbuchstaben begann.
"use strict";
// ---> strict violation
function something() {
this.test = "";
}
// ---> just fine (note the capital S in Something)
function Something() {
this.test = "";
}
Wenn Sie die Funktion als Variable deklarieren, anstatt die Standardfunktionsdeklaration zu verwenden, wird dies von jshint nicht als strikte Verletzung gekennzeichnet. Sie können also folgendes tun:
var gotoPage = function (s){
if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);}
};
var pageChange = function (event, sorter) {
var dd = event.currentTarget;
gotoPage.call(sorter, dd[dd.selectedIndex].value);
};
Wenn Sie versuchen, eine Methode zu implementieren, können Sie stattdessen den Prototypen zuweisen:
ExampleClassName.protytpe.gotoPage = function gotoPage(s){
// code using this
};
JSHint gibt keine Warnung aus, wenn die Funktion zugewiesen wird.