Considérez ce code simple:
"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( this )();
}
};
function g() {
console.log( this.prop );
}
Si j'essaye de valider ce code, jshint me donne l'erreur Possible strict violation.
Où j'appelle console.log( this.prop );
. En effet, this
n'est pas défini en mode strict dans une fonction.
Mais je lie cette fonction avant de l'appeler, donc this
est le bon objet.
J'utilise ce "modèle de conception" pour éviter d'encombrer l'objet principal. Passer les propriétés dans les paramètres encombrera également la fonction, donc je refuse de le faire. D'ailleurs, c'est exactement ce à quoi sert bind
.
Existe-t-il un moyen pour JSHint de me laisser faire cela?
Il est extrêmement difficile de détecter ce cas sans exécuter le code. Vous pouvez utiliser l'option validthis
pour supprimer cet avertissement:
"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( this )();
}
};
function g() {
/*jshint validthis:true */
console.log( this.prop );
}
Il est à noter que les commentaires jshint ont une portée de fonction. Ainsi, le commentaire fonctionnera pour la fonction g
et ses fonctions internes, pas seulement la ligne suivante.
Vous pouvez également obtenir le même effet si vous modifiez votre code comme suit pour éviter d'utiliser this
tous ensemble.
"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( null, this )();
}
};
function g(self) {
console.log( self.prop );
}
Voici une solution plus simple qui ne nécessite aucun changement de modèle ou de balisage spécifique pour jshint:
"use strict";
var obj = {
f: function() {
this.prop = 'value';
G.bind( this )();
}
};
function G() {
console.log( this.prop );
}
jshint suppose que vous suivez la convention selon laquelle les fonctions commençant par une lettre majuscule sont des classes qui seront instanciées et auront toujours this
disponible.
Essayer:
"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( this )();
}
};
var g = function() {
console.log( this.prop );
}
Il s'agit d'un "modèle de conception" différent, comme vous le dites, il réalise la même chose, mais évite complètement le problème.
"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 );
};
vous l'invoqueriez ainsi:
var myO = new obj();
myO.f();