73 votes

JSHint "Violation stricte possible." lors de l'utilisation de `bind`

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'essaie de valider ce code, jshint me donne l'erreur Possible strict violation. lorsque j'appelle console.log( this.prop );. Cela est dû au fait que this est indé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 "pattern de design" pour éviter d'encombrer l'objet principal. Passer les propriétés en paramètres encombrerait également la fonction, ce que je refuse de faire. De plus, c'est exactement à quoi sert bind.

Existe-t-il un moyen pour JSHint de me permettre de le faire ?

128voto

Anton Kovalyov Points 1413

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 de jshint sont à portée de fonction. Ainsi, le commentaire fonctionnera pour la fonction g et ses fonctions internes, pas seulement pour la ligne suivante.

7voto

George Points 364

Vous pouvez également obtenir le même effet si vous modifiez votre code comme suit pour éviter d'utiliser this tout à fait.

"use strict";

var obj = {
    f: function() {
        this.prop = 'valeur';
        g.bind( null, this )();
    }
};

function g(self) {
    console.log( self.prop );
}

3voto

xgrtl Points 131

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 = 'valeur';
        G.bind( this )();
    }
};

function G() {
    console.log( this.prop );
}

Jshint suppose que vous suivez la convention selon laquelle les fonctions commençant par une majuscule sont des classes qui seront instanciées et ayant toujours this disponible.

1voto

Michał Wojas Points 106

Essayer:

"use strict";

var obj = {
    f: function() {
        this.prop = 'valeur';
        g.bind( this )();
    }
};

var g = function() {
    console.log( this.prop );
}

0voto

George Points 364

C'est un modèle de conception différent, comme vous l'avez dit, il atteint le même objectif, mais évite complètement le problème.

"use strict";

function obj() {
    this.prop = '';
}

obj.prototype.f = function obj_f() {
    this.prop = 'valeur';
    this.g();
};

obj.prototype.g = function obj_g() {
    console.log( this.prop );
};

vous l'invoqueriez ainsi :

var myO = new obj();
myO.f();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X