Pourquoi JSHINT se plaint - il qu'il s'agit d'une violation stricte?

je pense que cela peut être un duplicata de Violation stricte en utilisant ce mot clé et de révéler le modèle de module

j'ai ce 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);
}

et JSHINT (JSLINT) se plaint. C'est écrit " violation stricte."pour la ligne en surbrillance:

enter image description here

est mon utilisation de Function.call() et en faisant référence à l'instance, quelque chose d'inapproprié?

est-ce considéré comme un mauvais style?

96
demandé sur Community 2011-10-07 18:36:07

4 réponses

JSHint dit" violation stricte Possible "parce que vous utilisez this à l'intérieur de quelque chose qui, pour autant qu'il puisse dire, n'est pas une méthode.

en mode non-strict, appelant gotoPage(5) lierait this à l'objet global ( window dans le navigateur). En mode strict, this serait undefined , et vous auriez des problèmes.

probablement, vous voulez dire appeler cette fonction avec un contexte lié this , par exemple gotoPage.bind(myObj)(5) ou gotoPage.call(myObj, 5) . Si c'est le cas, vous pouvez ignorer JSHint, car vous ne générerez pas d'erreurs. Mais, il vous dit que votre code n'est pas clair pour quiconque le lit, parce que l'utilisation de this à l'intérieur de quelque chose qui n'est pas évidemment une méthode est assez déroutante. Il serait préférable de simplement passer l'objet comme paramètre:

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);
}
122
répondu Domenic 2011-10-07 14:53:06

j'ai eu ce message pour une fonction qui n'a pas commencer avec une lettre majuscule.

"use strict";

// ---> strict violation
function something() {
    this.test = "";
}


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}
93
répondu amenthes 2014-11-25 01:28:10

si vous déclarez la fonction comme une variable au lieu d'utiliser la déclaration de fonction standard, jshint ne signalera pas cette violation comme une violation stricte. Donc vous pouvez faire ce qui suit -

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
répondu asulaiman 2015-04-27 17:25:40

si vous essayez d'implémenter une méthode, vous pourriez vouloir affecter au prototype à la place:

ExampleClassName.protytpe.gotoPage = function gotoPage(s){
  // code using this
};

JSHint ne prévient pas quand la fonction est assignée.

0
répondu Flimm 2015-08-14 16:16:35