javascript - visual - JSHint "posible violación estricta" cuando se utiliza `bind`
jshint vscode (5)
Considera este código simple:
"use strict";
var obj = {
f: function() {
this.prop = ''value'';
g.bind( this )();
}
};
function g() {
console.log( this.prop );
}
Si trato de validar este código, jshint me da el error Possible strict violation.
donde llamo console.log( this.prop );
. Esto es porque this
no está definido en modo estricto en una función.
Pero estoy vinculando esta función antes de llamarla, así que this
es el objeto correcto.
Estoy usando este "patrón de diseño" para evitar abarrotar el objeto principal. Pasar las propiedades en los parámetros también saturará la función, así que me niego a hacerlo. Además, esto es exactamente para lo que es el bind
.
¿Hay alguna manera para que JSHint me deje hacer esto?
Aquí hay una solución más simple que no requiere ningún cambio de patrón o marcado específico para jshint:
"use strict";
var obj = {
f: function() {
this.prop = ''value'';
G.bind( this )();
}
};
function G() {
console.log( this.prop );
}
jshint asume que estás siguiendo la convención de que las funciones que comienzan con una letra mayúscula son clases que se crearán instancias y siempre estarán disponibles.
Es extremadamente difícil detectar este caso sin ejecutar el código. Puede usar la opción validthis
para suprimir esta advertencia:
"use strict";
var obj = {
f: function() {
this.prop = ''value'';
g.bind( this )();
}
};
function g() {
/*jshint validthis:true */
console.log( this.prop );
}
Se debe tener en cuenta que los comentarios jshint tienen un alcance funcional. Entonces, el comentario funcionará para la función g
y sus funciones internas, no solo para la siguiente línea.
Este es un "patrón de diseño" diferente, como usted dice, logra lo mismo, pero evita el problema por completo.
"use strict";
function obj() {
this.prop = '''';
}
obj.prototype.f = function obj_f() {
this.prop = ''value'';
this.g();
};
obj.prototype.g = function obj_g() {
console.log( this.prop );
};
lo invocarías así:
var myO = new obj();
myO.f();
También puede lograr el mismo efecto si modifica su código a lo siguiente para evitar usarlo todo junto.
"use strict";
var obj = {
f: function() {
this.prop = ''value'';
g.bind( null, this )();
}
};
function g(self) {
console.log( self.prop );
}
Tratar:
"use strict";
var obj = {
f: function() {
this.prop = ''value'';
g.bind( this )();
}
};
var g = function() {
console.log( this.prop );
}