¿Por qué JSHINT se queja de que se trata de una violación estricta?

98

Creo que esto puede ser un duplicado de la infracción estricta al usar esta palabra clave y revelar el patrón del módulo

Tengo este codigo:

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

Y JSHINT (JSLINT) se queja. Dice "Violación estricta". para la línea resaltada:

ingrese la descripción de la imagen aquí

¿Mi uso Function.call()y luego hacer referencia a la instancia es inapropiado de alguna manera?

¿Se considera esto de mal estilo?

Cheeso
fuente
¿Solo dice "Violación estricta", sin ningún mensaje de error detallado?
stivlo
No puedo reproducir el problema, ejecuté el código a través de JSHint y JSLint y no parece quejarse de nada.
Peter Olson
54
Tenga en cuenta que esto sería mucho más fácil de diagnosticar si no intentara meterlo en una frase ridícula: P.
Domenic
1
He visto esto en otra pregunta (no puedo encontrarlo en este momento). Tiene que ver con el uso de this. No tengo idea de por qué JSLint lo llamaría una infracción estricta, pero sí sé que si no define el thisvalor de una función, estará undefineden modo estricto. Claramente lo estás definiendo this, por lo que no debería ser un problema.
user113716
2
Puede pasar por alto estas posibles violaciónes estrictos con "-W040":truela configuración JSON, pero como JSON no tiene comentarios, no se puede decir a nadie por qué está ahí.
kojiro

Respuestas:

124

JSHint dice "Posible violación estricta" porque está usando thisdentro algo que, por lo que puede decir, no es un método.

En modo no estricto, la llamada gotoPage(5)se vincularía thisal objeto global ( windowen el navegador). En modo estricto, thislo sería undefined, y te meterías en problemas.

Presumiblemente, quiere llamar a esta función con un thiscontexto enlazado , por ejemplo, gotoPage.bind(myObj)(5)o gotoPage.call(myObj, 5). Si es así, puede ignorar JSHint, ya que no generará ningún error. Pero te está diciendo que tu código no es claro para cualquiera que lo lea, porque usar thisdentro de algo que obviamente no es un método es bastante confuso. Sería mejor simplemente pasar el objeto como parámetro:

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);
}
Domenic
fuente
12
Aun así, creo que están siendo un poco engañosos en la descripción. Incluso si thistermina siendo undefined, entonces el problema real no es solo una violación de modo estricto . Harían mejor en dar una advertencia diciendo que thispuede ser undefinedcuando están en "modo estricto", lo que lleva a TypeError(o algo).
user113716
11
@ ripper234 de hecho, es por eso que siempre uso en event.currentTargetlugar de this.
Domenic
4
¿Qué directiva de configuración puedo agregar .jshintrcpara deshabilitar esta verificación?
callum
7
@callum "validthis": verdadero
Brett
18
Úselo /* jshint validthis: true */si solo tiene un par y no desea cambiar para cada caso.
knownasilya
93

Recibí este mensaje para una función que no comenzaba con mayúscula.

"use strict";

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


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}
amenthes
fuente
28
Me gustaría señalar que jshint probablemente está asumiendo, debido a la convención, que Somethinges un constructor debido a la S mayúscula, por lo que debería llamarse using new. Si lo hace, se define thiscomo un objeto nuevo basado en 'Something.prototype'. Lo más probable es que se deba a esa suposición que no genera la posible advertencia de violación estricta.
Andy Merts
4
Tuve este error en un proveedor de AngularJS, por lo que se esperan nombres de métodos en mayúsculas y minúsculas en camello. Fijo.
Deminetix
Tuve un problema similar, cuando tenía un nombre de función solo en minúsculas, cambiando el nombre usando una Capital.
GibboK
No use la primera letra mayúscula porque también es un constructor, se enfrentará a otro problema. en lugar de, puede usar: var fnAbc = function () {this.test = ""}
Hieu Tran AGI
La letra mayúscula no cambia nada sobre el funcionamiento interno de la función. Es algo que los programadores suelen hacer de esta manera para transmitir significado. En otras palabras: este no es un problema tecnológico, sino de comunicación entre humanos.
amenthes
9

Si declara la función como una variable en lugar de usar la declaración de función estándar, jshint no marcará esto como una violación estricta. Entonces puede hacer lo siguiente:

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

Si está intentando implementar un método, es posible que desee asignarlo al prototipo:

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

JSHint no advertirá cuando se asigne la función.

Flimm
fuente
Todavía no es lo suficientemente bueno. ClassName.prototype.myMethod = myMethod;, luego definió el método a continuación. Aún recibe un error aunque myMethod esté correctamente vinculado.
Jefftopia