web-dev-qa-db-fra.com

JSHint "Possible violation stricte." 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'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?

73
Florian Margaine

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.

128
Anton Kovalyov

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 );
}
7
George

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.

3
xgrtl

Essayer:

"use strict";

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

var g = function() {
    console.log( this.prop );
}
1
Michał Wojas

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();
0
George