web-dev-qa-db-fra.com

Erreur JSLint: 'this' inattendu

J'ai du mal à comprendre pourquoi JSLint est surpris par mon utilisation de this dans le code suivant:

function testConstr (x) {
    'use strict';
    this.joker = "Whyyy sooo seriousss?";
    this.x = x;
}

Pour les deux assignations de propriétés, JSLint indique: Inattendu 'this'. Comment corriger mon code?

37
jdw

Votre code pourrait serait parfaitement correct (il pourrait également être problématique, selon la façon dont vous appelez testConstr).

Ma suggestion est la suivante: dites à JSLint de se taire

enter image description here

Ou n'utilisez pas du tout JSLint.

29
Oriol
'use strict';

var SudoConstructor = (function () {

    /* We need bind, < IE9 needs a (tiny) polyfill */

    function protoEsqDeclare(sudoThis) {
        return sudoThis;
    }

    function protoEsqSet(sudoThis, newValA, newValB) {
        sudoThis.valA = newValA;
        sudoThis.valB = newValB;
    }

    function instanceCreator(valA, valB) {
        var sudoThis = {
            valA: valA,
            valB: valB
        };

        return {
            declare: protoEsqDeclare.bind(null, sudoThis),
            set: protoEsqSet.bind(null, sudoThis)
        };

    }

    return instanceCreator;

}());
3
Lee

Dans un mode strict, la référence this est définie sur undefined.

Ainsi, vos deux déclarations entraîneront la lecture des propriétés de l'objet undefined, ce qui entraînera une exception.

Comment corriger mon code?

Supprimez ces deux lignes.

UPD: Ce que je dis ci-dessus est la façon dont JSLint traite votre code, pas comment je le fais.

2
zerkms

JSLint dit: Inattendu 'ceci'. Comment corriger mon code?

Il n'est pas nécessaire de corriger votre code.

Dans la page d'aide pour JSLint , dans la section relative à la directive /*jslint*/, une option "Tolerate this" a été ajoutée à la table des options disponibles:

+---------------+------+---------------------------------+
| Tolerate this | this | true if this should be allowed. |
+---------------+------+---------------------------------+

Donc, pour supprimer les plaintes concernant l'utilisation de this, placez la directive suivante dans votre fichier source avant la première instruction:

/*jslint
    this
*/

(Notez que d'autres options /*jslint*/ peuvent suivre this en insérant une virgule entre les options. Voir la page d'aide de JSLint.)

Voir aussi la réponse de @Oriol pour activer l’option "Tolerate this" dans l’interface utilisateur de JSLint.

1
DavidRR

Une vieille question que je connais, mais au cas où cela aiderait quelqu'un, je regardais un discours de Douglas Crockford dans lequel il disait (vers 23 minutes) qu’il l’avait retirée parce qu’un attaquant pouvait utiliser une méthode avoir accès à la portée globale avec le mot clé 'this'.

Il a ajouté que cela impliquait également de ne plus utiliser Object.create - une fonctionnalité qu'il a aidé à introduire dans la langue!

0
leon segal