JSLint-Problem mit 'window' als globaler Variable

75

Ich verwende JSLint , um Fehler zu erkennen. Ich deaktiviere einige Optionen, die mir nicht gefallen, aber ich sehe keine Möglichkeit, die Verwendung der windowglobalen Variablen zu ermöglichen. Nun, es gibt die Yahoo Widget-Option, aber das ist übertrieben.

Was ist mit der Verwendung von "Fenster" zu tun? Warum sollte JSLint sagen, dass dies Fehler verursacht?

Björn
quelle
Wie benutzt man Fenster? Sie könnten wahrscheinlich die Abhängigkeit davon entfernen, obwohl die unten stehende Lösung von bjoernwibben den Job zu erledigen scheint.
Guðmundur H
Nun, ich habe es für window.setTimeout verwendet. Ich weiß, dass ich das nicht muss und wahrscheinlich auch nicht sollte, aber an einigen Stellen, an denen ich mit mehreren Fenstern in einer Firefox-Erweiterung arbeite, würde ich Zugriff darauf benötigen. Vielen Dank!
Björn
Obligatorischer JSHint- Kommentar. Es behandelt einige dieser JSLint-Probleme und ist meiner Meinung nach viel hübscher. ;)
DondeEstaMiCulo

Antworten:

135
/*jslint browser: true*/

War die richtige Lösung dafür. Ab dem 07.07.2017 müssen Sie die globale Direktive manuell festlegen. Aus der JSLint-Dokumentation :

Die Direktive / * global * / wird verwendet, um eine Reihe von Globals (normalerweise Funktionen und Objekte, die Funktionen enthalten) anzugeben, die für diese Datei verfügbar sind. Dies wurde häufig in Browsern verwendet, um Quelldateien miteinander zu verknüpfen, bevor ES6-Module angezeigt wurden. Von der Verwendung globaler Variablen wird dringend abgeraten, aber leider erfordern Webbrowser ihre Verwendung. Die Direktive / * global * / kann nur verwendet werden, wenn die Option Browser annehmen ausgewählt ist.

Sie müssen also Folgendes verwenden:

/*jslint browser */
/*global window */
Matt Clarkson
quelle
@bjoernwibeen hat in seiner Antwort gesagt, dass dies ab sofort die richtige Lösung ist. Beachten Sie, dass sich unsere beiden Antworten um zwei Jahre unterschieden.
Matt Clarkson
1
Die offizielle Dokumentation zur Unterstützung finden Sie unter: 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. Dies beinhaltet auch ein Fenster.
Koen Zomers
Markierte es als die richtige Antwort. Hätte den Kommentar zu der Frage hinzufügen sollen, damit ich eine Warnung bekommen hätte, die diese 3 Jahre nicht zu spät behoben wurde. : P
Björn
1
@BjornTipling, sorry. Ich weiß jetzt, dass ich in Zukunft einen Kommentar zu dieser Frage schreiben muss!
Matt Clarkson
@ryanpcmcquen, das JSLint-Handbuch sagt immer noch, dass dies der richtige Weg ist. Die Website jslint.com ignoriert derzeit sogar das Kontrollkästchen "Browser".
Matt Clarkson
76

Machen Sie einfach einen Kommentar in Ihrem Skript wie folgt:

/*global window */

... your script goes here

Dieser Kommentar teilt JSLint mit, dass er an einer windowanderen Stelle definiert ist.

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

JSLint erkennt auch einen /* global */Kommentar, der JSLint anzeigen kann, dass die in dieser Datei verwendeten Variablen in anderen Dateien definiert wurden. Der Kommentar kann eine durch Kommas getrennte Liste von Namen enthalten. Auf jeden Namen kann optional ein Doppelpunkt folgen, und entweder true oder false, true gibt an, dass die Variable von dieser Datei zugewiesen werden kann, und false, um anzuzeigen, dass die Zuweisung nicht zulässig ist. Dies ist die Standardeinstellung.

Wenn das Fenster standardmäßig global sein soll, ohne dass der Kommentar auf Ihr Skript angewendet werden muss, können Sie predef:["window"]den Objektliteralparameter in der JSLINTFunktion Ihrer lokalen jslint.jsDatei hinzufügen .

Übrigens verwende ich predef:["$","window"]jQuery auch global.

Aktualisieren:

Diese Antwort war 2009 richtig. Ab sofort sollten Sie /*jslint browser: true*/die von Matt Clarkson bereitgestellte Lösung verwenden .

bjoernwibben
quelle
5
Obwohl diese Arbeit nicht die "richtige" Antwort ist. browser: trueist.
Tom Roggero
Wie in der obigen Antwort erwähnt, ist die Antwort von Matt Clarkson jetzt die richtige.
Superluminary
1
Beachten Sie, dass zwischen /*und kein Leerzeichen stehen darf, da globalJSLint die Deklaration anscheinend ignoriert.
KajMagnus
Dies ist nützlich für mich, da ich etwas baue, das ein paar andere globale Variablen hat. Vielen Dank.
Steve
Dies sollte jetzt die Antwort sein, da es /*jslint browser: true*/nicht mehr funktioniert.
Ryanpcmcquen
4

Fügen Sie windowdiese Anweisung oben in Ihrer Datei hinzu , damit JSLint weiß, dass Sie ein globales Objekt erkennen :

/*global window*/

Früher konnte ich verwenden:

/*jslint browser: true */

aber das scheint nicht mehr zu funktionieren. Nun, laut der JSHint-Hilfe bezüglich der browserOption:

Es liefert nicht selfoder window; Sie müssen diese Aliase des gefürchteten globalen Objekts selbst anfordern.

Ich bin mir nicht sicher, wann diese Änderung vorgenommen wurde, aber sie hat mich für eine Weile behindert.

akivajgordon
quelle
3

Ich musste beide oben genannten Antworten auf diesen Code verwenden, um alle Warnungen zu entfernen:

/*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));

Für mich ist dies die Lösung bei der Verwendung der JSLint-Website :

/*jslint browser:true*/
/*global window*/
ryanpcmcquen
quelle
1

Wenn Sie dies nicht in jeder Datei angeben möchten, können Sie es global in Ihrer eslintrc- Konfigurationsdatei wie folgt festlegen :

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