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:
¿Es mi uso de Function.call()
y luego hacer referencia a la instancia, ¿de alguna manera inapropiada?
¿Se considera que esto es mal estilo?
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 undefined
y 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 siendoundefined
entonces el actual problema no es solo un Modo estricto violación. Harían mejor en dar una advertencia diciendo quethis
quizásundefined
cuando está en “modo estricto”, lo que lleva a unTypeError
(o algo).– usuario113716
7 oct 2011 a las 15:13
-
@ripper234 de hecho, es por eso que siempre uso
event.currentTarget
en vez dethis
.– 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 usandonew
. Hacerlo definethis
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.
¿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 elthis
valor de una función, seráundefined
en modo estricto. Claramente estás definiendothis
por 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