75 votes

Le problème de JSLint avec 'window' comme variable globale

J'utilise donc JSLint pour essayer de détecter les erreurs. J'ai désactivé certaines options que je n'aime pas, mais je ne vois aucun moyen d'activer la possibilité d'utiliser l'option window variable globale. Il y a bien l'option Yahoo Widget, mais c'est un peu exagéré.

Quel est le problème avec l'utilisation de 'window', pourquoi JSLint dit que cela provoque des erreurs ?

0 votes

Comment utilisez-vous window ? Vous pourriez probablement supprimer la dépendance à cette dernière, bien que la solution de bjoernwibben ci-dessous semble faire l'affaire.

0 votes

Je l'utilisais pour window.setTimeout. Je sais que je n'ai pas à le faire et que je ne devrais probablement pas, mais dans certains cas où je travaille avec plusieurs fenêtres dans une extension Firefox, j'aurais besoin d'y avoir accès. Merci !

0 votes

Obligatoire JSHint commentaire. Il résout certains de ces problèmes de JSLint, et est beaucoup plus joli à mon avis ;)

135voto

Matt Clarkson Points 2876
/*jslint browser: true*/

C'était la bonne solution pour cela. À partir de 2017-07-07, vous devez définir la directive globale manuellement. Depuis le Documentation sur JSLint :

La directive /*global*/ est utilisée pour spécifier un ensemble de globaux (généralement des fonctions et des objets contenant des fonctions) qui sont disponibles pour ce fichier. Cette directive était couramment utilisée dans les navigateurs pour lier les fichiers sources entre eux avant l'apparition des modules ES6. L'utilisation de variables globales est fortement déconseillée, mais malheureusement les navigateurs web exigent leur utilisation. La directive /*global*/ ne peut être utilisée que lorsque l'option Assumer un navigateur est sélectionnée.

Vous devrez donc utiliser :

/*jslint browser */
/*global window */

0 votes

@bjoernwibeen a dit dans sa réponse que c'est la solution correcte à partir de maintenant. Notez qu'il y a deux ans de différence entre nos deux réponses.

1 votes

La documentation officielle à l'appui peut être trouvée à l'adresse suivante : jslint.com/lint.html#options Some globals can be predefined for you. Select the Assume a browser (browser) option to predefine the standard global properties that are supplied by web browsers, such as document and addEventListener. Cela inclut également la fenêtre.

0 votes

Je l'ai marqué comme étant la bonne réponse. J'aurais dû ajouter le commentaire à la question pour recevoir une alerte, mais je n'ai pas corrigé ce problème 3 ans trop tard :P

76voto

bjoernwibben Points 1031

Il suffit de faire un commentaire dans votre script comme ça :

/*global window */

... your script goes here

Ce commentaire indique à JSLint que window est définie ailleurs.

Voir : http://www.JSLint.com/lint.html ,

JSLint reconnaît également un /* global */ commentaire qui peut indiquer à JSLint que les variables utilisées dans ce fichier ont été définies dans d'autres fichiers. Le commentaire peut contenir une liste de noms séparés par des virgules. Chaque nom peut éventuellement être suivi de deux points et de true ou false, true indiquant que la variable peut être assignée par ce fichier, et false indiquant que l'assignation n'est pas autorisée, ce qui est le cas par défaut.

Lorsque vous voulez que la fenêtre soit globale par défaut sans avoir à appliquer le commentaire à votre script, vous pouvez ajouter predef:["window"] au paramètre littéral de l'objet à l'intérieur du JSLINT de la fonction de votre jslint.js fichier.

BTW, j'utilise predef:["$","window"] pour avoir jQuery global aussi.

Mise à jour :

Cette réponse était correcte en 2009. A partir de maintenant, vous devez utiliser la solution /*jslint browser: true*/ fourni par Matt Clarkson.

5 votes

Même si cela fonctionne, ce n'est pas la "bonne" réponse. browser: true est.

0 votes

Comme mentionné dans la réponse ci-dessus, la réponse de Matt Clarkson est maintenant la bonne.

1 votes

Notez qu'il ne doit pas y avoir d'espace entre /* y global ou JSLint ignore apparemment la déclaration.

4voto

akivajgordon Points 4604

Pour faire savoir à JSLint que vous reconnaissez window comme un objet global, ajoutez cette directive en haut de votre fichier :

/*global window*/

J'avais l'habitude de pouvoir utiliser :

/*jslint browser: true */

mais cela ne semble plus fonctionner. Maintenant, selon le Aide JSHint concernant le browser option :

Il ne fournit pas self o window vous devrez demander vous-même ces alias de l'objet global redouté.

Je ne sais pas exactement quand ce changement a été effectué, mais j'ai été bloqué pendant un moment.

3voto

ryanpcmcquen Points 2896

J'ai dû utiliser les deux réponses ci-dessus sur ce code pour me débarrasser de tous les avertissements :

/*jslint browser:true*/
/*global window*/
// eventBoiler v0.1.1 by @ryanpcmcquen
// https://github.com/ryanpcmcquen/eventBoiler
(function (win, doc) {
    'use strict';
    win.eventBoiler = function (selector, typeOfEvent, func) {
        doc.querySelector(selector).addEventListener(typeOfEvent, func);
    };
    win.eventBoiler.all = function (selectors, typeOfEvent, func) {
        Array.prototype.slice.call(doc.querySelectorAll(selectors)).map(function (i) {
            i.addEventListener(typeOfEvent, func);
        });
    };
}(window, document));

Donc pour moi, c'est la solution lorsque l'on utilise l'option Site web de JSLint :

/*jslint browser:true*/
/*global window*/

1voto

nilsi Points 310

Si vous ne voulez pas le spécifier dans chaque fichier, vous pouvez le définir globalement dans votre fichier eslintrc comme ceci :

"globals": {
    "window": true,
}

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