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

5 minutos de lectura

avatar de usuario
queso

Creo que esto puede ser un duplicado de Strict Violation usando esta palabra clave y revelando un patrón de 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 está quejando. Dice “Violación estricta”. para la línea resaltada:

ingrese la descripción de la imagen aquí

¿Es mi uso de Function.call() y luego hacer referencia a la instancia, ¿de alguna manera inapropiada?

¿Se considera que esto es mal estilo?

  • ¿Solo dice “Violación estricta”, sin ningún mensaje de error detallado?

    – stivlo

    7 oct 2011 a las 14:40

  • No puedo reproducir el problema, ejecuté el código a través de JSHint y JSLint y no parece quejarse de nada.

    – Peter Olsen

    7 oct 2011 a las 14:40

  • 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

    7 oct 2011 a las 14:43

  • He visto esto en otra pregunta (no puedo encontrarlo ahora). Tiene que ver con el uso de this. No tengo idea de por qué JSLint lo llamaría una violación estricta, pero sé que si no define el this valor de una función, será undefined en modo estricto. Claramente estás definiendo thispor lo que no debería ser un problema.

    – usuario113716

    7 oct 2011 a las 14:47

  • Puedes ignorar estos posibles violaciones estrictas con "-W040":true en config json, pero como json no tiene comentarios, no puedes decirle a nadie por qué está ahí.

    – kojiro

    5 de abril de 2013 a las 17:17

avatar de usuario
Domenico

JSHint dice “Posible violación estricta” porque está usando this dentro de algo que, por lo que se puede decir, no es un método.

En modo no estricto, llamando gotoPage(5) se uniría this al objeto global (window en el navegador). En modo estricto, this sería undefinedy te meterías en problemas.

Presumiblemente, quiere llamar a esta función con un límite this contexto, 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, le está diciendo que su código no está claro para cualquiera que lo lea, porque usar this dentro 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);
}

  • Aun así, creo que están siendo un poco engañosos en la descripción. Incluso si this termina siendo undefinedentonces el actual problema no es solo un Modo estricto violación. Harían mejor en dar una advertencia diciendo que this quizás undefined cuando está en “modo estricto”, lo que lleva a un TypeError (o algo).

    – usuario113716

    7 oct 2011 a las 15:13


  • @ripper234 de hecho, es por eso que siempre uso event.currentTarget en vez de this.

    – Domenic

    10 de diciembre de 2012 a las 3:50

  • ¿A qué directiva de configuración puedo agregar? .jshintrc desactivar esta verificación?

    – callo

    5 de febrero de 2014 a las 17:09

  • @callum “validthis”: verdadero

    – Brett

    30 de abril de 2014 a las 23:25

  • Usar /* jshint validthis: true */ si solo tienes un par y no quieres cambiar para cada caso.

    – conocida asilya

    24 de julio de 2014 a las 14:21

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

"use strict";

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


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

  • Me gustaría señalar que jshint probablemente esté asumiendo, debido a la convención, que Something es un constructor debido a la S mayúscula, por lo que debe llamarse usando new. Hacerlo define this ser un nuevo objeto basado en `Algo.prototipo’. Lo más probable es que se deba a esa suposición de que no plantea la posible advertencia de infracción estricta.

    –Andy Merts

    07/01/2015 a las 21:33


  • Tuve este error en un proveedor de AngularJS, por lo tanto, se esperaban nombres de métodos en mayúsculas y minúsculas y yo tenía minúsculas. Fijado.

    – Desminetix

    24 de marzo de 2015 a las 0:27

  • Tuve un problema similar, cuando tenía un nombre de función solo en minúsculas, renombraba usando Mayúsculas.

    – GibboK

    9 de julio de 2015 a las 8:48

  • 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

    27 de abril de 2017 a las 2:32

  • 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.

    – menciones

    28 de abril de 2017 a las 8:05

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. Así que puedes 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);
};

Si está tratando de implementar un método, es posible que desee asignarlo al prototipo en su lugar:

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

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

¿Ha sido útil esta solución?