JS und Multitasking

  • Themenstarter Themenstarter Lumakrieger
  • Beginndatum Beginndatum
L

Lumakrieger

Hallo sehr geehrte Tutorials.de-Gemeinde,

ich lerne nun seit gut 3 Wochen Javascript. Leider habe ich bisher keine so genialen Hilfeseiten wie SELFHTML für HTML und php.net für PHP auch für Javascript gefunden. Ich finde immer nur begrenzt gute Anleitungen. Kann mir da bitte jemand wirklich gute Seiten für JS posten?

Nun zu meinen eigentlichen Fragen, die ich bisher nicht klären konnte:

In einen meiner Scripts rufe ich zu Beginn verschiedene Funktionen auf. Manche dieser Funktionen rufen sich am Ende der Funktion selbst nach einer Sekunde Verzögerung auf. Dies klappt wunderbar und so kommt es, dass ich eine Uhr und andere feine Sachen auf meiner Webseite paralell laufen habe. Daraus schliesse ich, dass JS Multitasking beherrscht. Aber wie genau Funktioniert es? Wie arbeitet JS? Arbeitet es in diesem Bereich in jedem Browser gleich? Wie wird das folgende Beispiel verarbeitet?

Javascript:
function1();
function2();
function3();

Ruft er wie in z.B. PHP jede Funktion nach Abschliessen der Anderen auf oder doch immer wie es mir scheint direkt nach dem Aufruf der Vorherigen, auch wenn diese nicht abgearbeitet ist => Threads => Multitasking
Wenn die Funktionen zu Threads verwandelt werden, wie kann ich das verhindern, falls ich mal Funktionen habe, die in einem Zyklus schön Eine nach der Anderen verarbeitet werden sollen?

Dadurch, dass ich keine guten Tutorials gefunden habe, habe ich eine schlechte Vorstellung von Javascripts Arbeitsweise :mad:

Und noch eine kleine Frage am Rande: Wie mache ich Variablen einer Funktion global, damit sie nicht mehr auf die Funktion selbst begrenzt sind?

Danke, Lumakrieger
 
Zuletzt bearbeitet von einem Moderator:
Hi,

Ruft er wie in z.B. PHP jede Funktion nach Abschliessen der Anderen auf
das sollte eigentlich so sein, denn ansonsten würde folgendes nicht funktionieren:
Javascript:
function foo() {
    return "Hallo";
}

function bar(str) {
  alert(str+ " Welt");
}

bar(foo()); // Ausgabe: "Hallo Welt"

Wie mache ich Variablen einer Funktion global, damit sie nicht mehr auf die Funktion selbst begrenzt sind?
Indem Du sie ausserhalb der Funktion deklarierst und/oder innerhalb der Funktion auf das Schlüsselwort "var" verzichtest:
Javascript:
var foo = 2;

function fooMore(x) {
    foo += x;
}

fooMore(3);

alert(foo); // Ausgabe: 5

Gruß
.
 
Danke erstmal für die Antwort.

Aber in dem Beispiel:

bar(foo()); // Ausgabe: "Hallo Welt"
...ruft er ja die eine Funktion innerhalb der Anderen auf. Was ist aber, wenn man erst foo(); und direkt dahinter bar("Hallo"); aufruft?


Eine weitere Frage:
Ich habe die globale Variable X und eine in einer Funktion eingesperrte lokale Variable X. Diese lokale Variable deklariere ich nun in der Funktion mit var X und rufe sie mir X auf. Aber wie rufe ich nun in der Funktion die globale Variable X auf?

Danke, Lumakrieger
 
Hi,

in dem Beispiel:

bar(foo()); // Ausgabe: "Hallo Welt"
...ruft er ja die eine Funktion innerhalb der Anderen auf.
Nein, es wird zuerst die Funktion foo aufgerufen, und das Ergebnis als Parameter beim Aufruf der Funktion bar mitgegeben.
Was ist aber, wenn man erst foo(); und direkt dahinter bar("Hallo"); aufruft?
Probier mal:
Javascript:
function foo() {
	return "Hallo";
}
function bar(str) {
	return str+ " Welt";
}

var f = foo();

alert(bar(f));
Auch hier wird zunächst foo aufgerufen, und dann bar (was man daran erkennt, dass die Variable "f" übergeben wird.

Ich habe die globale Variable X und eine in einer Funktion eingesperrte lokale Variable X. Diese lokale Variable deklariere ich nun in der Funktion mit var X und rufe sie mir X auf. Aber wie rufe ich nun in der Funktion die globale Variable X auf?
Sie wird in der Tat. als lokale Variable behandelt.
Javascript:
var a = 10;

function foo() {
	var a = 5;
	a ++;
	return a;
}

var b = foo();

alert(a); // Ausgabe: 10 (unverändert)
alert(b); // Ausgabe: 6
(Du solltest es allerdings selbst ausprobieren; ich habe nur mit ActionScript getestet)#

Man sollte aus Verwechslungsgründen generell darauf verzichten, globalen Variablen und in Funktionen verwendete lokale Variablen gleich zu benennen. Nicht nur der Interpreter, sondern auch ein Leser des Quelltextes kann dadurch verwirrt werden. ;)

Ob und wie man per JS auf identisch benannte globale Variablen zugreift, müsste ich auch erst nachschlagen - ratsam ist es, wie gesagt nicht.

Gruß
.
 
Okay danke,

aber nochmal, wenn ich folgenden Quellcode habe:

function func1(){
Tue etwas
func1(); <- Kann sein, muss aber nicht!
}

function func2(){
Tue etwas anderes
func2(); <- Kann sein, muss aber nicht!
}

func1();
func2();

Dann scheint es so, als ob sie gleichzeitig ablaufen. Ich denke sie verlaufen auch gleichzeitig. Aber wie verhinder ich das? Ich kann doch nicht jedes mal ne Wartezeit dazwischen schalten, oder?
 
Hi,

wie kommst Du zu der Ansicht, sie würden gleichzeitig laufen (tatsächlich werden einfache Funktionen so schnell abgehandelt, dass Du keinen zeitlichen Unterschied merkst, wenn Du daneben sitzt und wartest, aber mit Multithreading hat das nichts zu tun)?

Wenn Du so etwas hast:
Code:
function func1() {
  ...
  func1();
}

func1();
hast Du eine Rekursion, die (wenn nicht beendet) irgendwann zum Abbruch des Scripts führen wird.

Hast Du einen konkreten Einsatzzweck oder ein Problem, auf das sich Deine Frage bezieht? Möglicherweise können wir Dir dann einfacher helfen, als auf dieser abstrakten Ebene. ;)

Gruß
.
 
Hi,

mhh dann muss ich nochmal in meinem Skript nachgucken. Ich bin mir ziemlich sicher das dies nebeneinander abläuft! Oder bedeutet das onload im Body, dass es ständig wiederholt wird, weil das ruft bei mir einmal die Uhr und den anderen Kram auf.

Gibt es denn sonstige Multitaskingmöglichkeiten in JS?
 
Hi,

onLoad ist ein Ereignis, das feuert, sobald die Seite komplett geladen ist. In der Regel wird das aber pro Seitenaufruf nur einmal der Fall sein.

Es ist kein Problem, mehrere Pseudoprozesse wie eine Uhr, einen Countdown und eine kleine Animation "parallel" laufen zu lassen - auch wenn die betreffenden Funktionen nacheinander ausgeführt werden, wird das der Benutzer bei hinreichend kleinen Intervallen (ich nehme an, Du arbeitest mit setInterval bzw. setTimeout) nicht bemerken.

Geht es Dir um die Kommunikation Deiner Komponenten untereinander, bei der Du auf eine bestimmte Reihenfolge angewiesen bist, oder was ist Dein konkretes Problem?

Gruß
.
 
Hier mal ein kleines Beispiel, welches dich vielleicht eher überzeugt, dass Funktionen nacheinander abgearbeitet werden:
Code:
<html>
<head>
<title>Test</title>
</head>
<body>
<script type="text/javascript">
<!--
x=0;

function f1()
{
  for(i=0;i<1000000;++i)x++;
} 
function f2()
{
  document.write(x);
}
f1();f2();
//-->
</script>
</body>
</html>
f1() benötigt logischerweise einige Zeit für 1Mio Loops, f2() dagegen könnte recht schnell ausgeführt werden...wird es aber nicht, erst wenn f1() fertig ist.

JS-Anweisungen werden in der zeitlichen Reihenfolge abgearbeitet, in der sie aufgerufen werden....nacheinander.

Eine Ausnahme ist AJAX...während des Ausführens eines asynchronen HTTP-Requests ist der Browser imstande, weiterzuarbeiten,also bspw. andere JS-Anweisungen zu verarbeiten, ohne erst auf die Antwort auf die Anfrage warten zu müssen.
 
Hier mal einen Auszug aus meinem Script:

Javascript:
function onLoad(timestamp){

// Ein paar Funktionen, welche durch Body onLoad einmalig aufgerufen werden

// Darunter:

ticker();
time(timestamp);

repeat(); <- Geht in eine Endlosschleife die repeat(); wiederholt.

}

function ticker(){

// Führt einen Newsticker aus, der nach Ablauf wieder bei der ersten Nachricht anfängt -> Endlosschleife

}

function time(timestamp){

// Wandelt den von PHP gelieferten Timestamp in ein lesbares Format um und schreibt es in einen vorgesehenen Tag in HTML


timestamp++;
setTimeout('time('+timestamp+')',1000);

// Wartet noch eine Sekunde und erhöht dann den Timestamp um 1
}

In repeat(); werden dann noch einige Funktionen ständig abgefragt. Und auch nur dort kommt AJAX zum Einsatz.

Sorgt das setTimeout(); dafür, dass die Funktion in einem neuen Thread abgearbeitet wird oder wie soll ich mir das erklären, dass alle Aufgaben ausgeführt werden, obwohl die vorherige eigentlich noch in einer Unendlichschleife gefangen ist?
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück