• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] JSHint undefined variable

J

j-l-n

Guest
JSHint merkt mir an folgender Stelle "undefined variable (NotificationOptions)" an:
Code:
var notificationOptions;
notificationOptions = {
	dir: "auto",
	lang: "de",
	body: notificationMessage,
	tag: notificationId
};
if(notificationArguments.icon) {
	NotificationOptions.icon = notificationArguments.icon;
}
Wie kann ich das vermeiden? Außerdem meckert JSHint, wenn ich new Notification() verwende statt new window.Notification()...
 
Du kannst am Anfang der Datei angeben, welche globalen Variablen vorhanden sind:
Code:
/* global Notification, NotificationOptions*/
... oder du sprichst alle globalen Variablen über window.... an.

- - - Aktualisiert - - -

http://www.jshint.com/docs/ -> Inline Configuration.

- - - Aktualisiert - - -

Aha... beim Aktualisieren funktionieren die Links noch nicht...
 
Du kannst am Anfang der Datei angeben, welche globalen Variablen vorhanden sind:
Code:
/* global Notification, NotificationOptions*/
OK, danke.

- - - Aktualisiert - - -

Code:
var DOMReady;
	DOMReady = function DOMReady(callback){
		var isReady = function isReady(alreadyLoaded){
			if(alreadyLoaded){
				callback();
			}
			else{
				if(document.addEventListener){
					document.removeEventListener("DOMContentLoaded", isReady);
				}
				else if(document.attachEvent){
					document.detachEvent("onload", isReady);
				}
				callback();
			}			
		};
		if(typeof callback !== "function"){
			throw new Error("Callback is not a function.");
		}
		if(document.readyState === "complete" || document.readyState === "interactive"){ //if parsing of document is already finished
			isReady(true);
		}
		else{
			if(document.addEventListener){
				document.addEventListener("DOMContentLoaded", isReady);
			}
			else if(document.attachEvent){
				window.attachEvent("onload", isReady);
			}
		}
	};
	window.DOMReady = DOMReady;

	DOMReady(function(){
		console.info("DOM is ready.");
	});
Nun meckert JSHint "Missing 'new' prefix when invoking a constructor.". Wieso? Denn mit new gibt es die Meldung "Do not use 'new' for side effects."

Und hier noch ein Auszug von anderer Stelle:
Code:
		for(var i = 0; i < modules.length; i++){
			module = modules[i];
			if(typeof jln[module.substr(4, module.length)] !== "undefined"){ //remove leading "jln."
				console.log("Module " + module + " is ready.");
			}
			else{
				//...
				if(callback){
					var loadedModules, fireCallback;
					loadedModules = 0;
					fireCallback = function(modulesTotal, module, moduleUrl, script){
						loadedModules++;
						if(loadedModules === modulesTotal){
							console.info("All modules loaded. Executing callback function.");
							callback();
						}
					};
					//...
					script.onload = (function(modulesTotal, module, moduleUrl,script){
						return function(){
							fireCallback(modulesTotal, module, moduleUrl, script);
						};
					})(modules.length, module, moduleUrl, script);
Wie soll ich denn hier "Don't make functions within a loop." erfüllen? :confused:
 
Das Problem mit new ist einfach die Namenskonvention von JS. Normale Funktionen dürfen nicht mit einem Großbuchstaben anfangen. Und einen Konstruktor solltest du nur verwenden, wenn du das neu erstellte Objekt auch benutzt - und das kannst du nicht, wenn du den Konstruktor einfach so isoliert aufrufst.
Ich würde die Funktion einfach domReady nennen.

Bei der Funktion innerhalb der Schleife kann du die Funktion, die den Eventlistener erzeugt, davor definieren und dann einfach nur noch aufrufen. Oder du arbeitest mit .forEach - dann hast du gar keine Schleife und für jeden Durchgang einen eigenen Scope, so dass du die Eventlistener erzeugende Funktion gar nicht brauchst.
 
Ahhh...OK. Werde das dann gleich mal ändern. Danke nochmal für die ausführliche Erklärung! :eagerness:
 
Zurück
Oben