web-dev-qa-db-fra.com

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

Je pense que cela peut être une copie de Violation stricte utilisant ce mot clé et révélant 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. Il dit "violation stricte". pour la ligne en surbrillance: 

enter image description here

Est-ce que mon utilisation de Function.call() et la référence à l'instance sont inappropriées? 

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

97
Cheeso

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

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

Vous voulez probablement appeler cette fonction avec un contexte lié this, par ex. gotoPage.bind(myObj)(5) ou gotoPage.call(myObj, 5). Si tel est le cas, vous pouvez ignorer JSHint, car vous ne générerez aucune erreur. Mais cela vous dit que votre code n’est pas clair pour quiconque le lirait, car utiliser this à l'intérieur de quelque chose qui n'est manifestement pas une méthode est assez déroutant. Il serait préférable de simplement passer l'objet en tant que 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);
}
124
Domenic

J'ai reçu ce message pour une fonction qui ne commence pas par une lettre majuscule.

"use strict";

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


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}
93
amenthes

Si vous déclarez la fonction en tant que variable au lieu d'utiliser la déclaration de fonction standard, jshint ne l'indiquera pas 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
asulaiman

Si vous essayez d'implémenter une méthode, vous voudrez peut-être affecter au prototype:

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

JSHint ne préviendra pas lorsque la fonction est assignée.

0
Flimm