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


Creo que esto puede ser un duplicado de Violación estricta usando esta palabra clave y revelando el patrón del módulo

Tengo este código:

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:

introduzca la descripción de la imagen aquí

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

¿Se considera esto un mal estilo?

Author: Community, 2011-10-07

4 answers

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

En modo no estricto, llamar a gotoPage(5) enlazaría this al objeto global (window en el navegador). En modo estricto, this sería undefined, y se metía en problemas.

Presumiblemente, quieres llamar a esta función con un contexto this 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, lo es decirle 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 un 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);
}
 122
Author: Domenic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-07 14:53:06

He tenido este mensaje para una función que no comenzó 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 = "";
}
 93
Author: amenthes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-25 01:28:10

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 usted 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);
};
 9
Author: asulaiman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-27 17:25:40

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

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

JSHint no avisará cuando la función esté siendo asignada.

 0
Author: Flimm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-14 16:16:35