wake-up-neo.com

Warum beklagt sich JSHINT, dass dies ein strikter Verstoß ist?

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: 

enter image description here

Ist meine Verwendung von Function.call() und das Verweisen auf die Instanz irgendwie unangemessen? 

Ist das ein schlechter Stil?

97
Cheeso

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 thisundefined 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);
}
124
Domenic

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 = "";
}
93
amenthes

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);
};
9
asulaiman

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.

0
Flimm