Variabelname in setTimeout

jeipack

Erfahrenes Mitglied
Hi
Ich habe eine kurze Frage bezüglich Variablen die in setTimeout übergeben werden.


Hier ein kleiner Testcode.
Die Funktion blub wird aufgerufen und übergibt der Funktion hideNavi die Variabel navistyle. Diese Variable trägt in der Funktion hideNavi nur noch den Namen style.
Wenn ich in der Funktion hideNavi die Funktion nochmals aufrufen will kann ich aber nicht "style" übergeben sondern muss "navistyle" übergeben. Woher kommt das?

Javascript:
function blub() {
navistyle = document.getElementById("navi").style;
navispeed=1;
hideNavi(navistyle);
}


var navispeed=1;
function hideNavi(style) {
var width=parseFloat(style.width);

style.width=width-navispeed+"%";
navispeed=navispeed+1;

if(width>navispeed) {
setTimeout("hideNavi(navistyle)", 500);  //wieso hier navistyle und nicht style****
}
else {
style.width="0%";
}

}

Verstehe nicht ganz wieso hier nicht die Variable style genommen werden muss, weil die Variable "navistyle" ja nur in der Funkion blub() gültig sein dürfte und in hideNavi(style) diese gar nicht sichtbar sein sollte.

Grüsse
jeipack
 
Zuletzt bearbeitet von einem Moderator:
weil die Variable "navistyle" ja nur in der Funkion blub() gültig sein dürfte und in hideNavi(style) diese gar nicht sichtbar sein sollte.

Falsch. Es steht kein "var" davor, also ist es eine globale Variable.


Guck dir die Doku nochmal an: https://developer.mozilla.org/en/DOM/window.setTimeout

code in the alternate syntax, is a string of code you want to execute after delay milliseconds. (Using this syntax is not recommended for the same reasons as using eval()

[...]

Passing a string instead of a function to setTimeout() suffers from the same hazards as using eval.

String literals are evaluated in the global context, so local symbols in the context where setTimeout() was called will not be available when the string is evaluated as code.
 
Ahh.. stimmt. Ohne var davor ist es immer eine globale Variable, egal wo ich sie deklariere?

Und der setTimeout Funktion muss eine globale Variable übergeben werden, da sie nicht im Context der Funktion in der sie aufgerufen wurde ausgeführt wird?
 
Ohne var davor ist es immer eine globale Variable, egal wo ich sie deklariere?

Ja


Und der setTimeout Funktion muss eine globale Variable übergeben werden, da sie nicht im Context der Funktion in der sie aufgerufen wurde ausgeführt wird?

Nein, das wäre das falsche Ansatz. Du darfst setTimeout keinen String übergeben, sondern eine anonyme Funktion. Dann kannst du auch lokale Variablen benutzen.

Javascript:
function blub() {
	var navistyle = document.getElementById("navi").style;
	navispeed = 1;
	hideNavi(navistyle);
}

var navispeed = 1;

function hideNavi(style) {
	var width=parseFloat(style.width);
	 
	style.width = width - navispeed + "%";
	navispeed = navispeed + 1;
	
	if(width > navispeed) {
		setTimeout(function() {
			hideNavi(style)
		}, 500);
	}
	else {
		style.width = "0%";
	}
}

(ungetestet)
 

Neue Beiträge

Zurück