Auf Variablen aus anderen Funktionen zugreifen
Max
- javascript
Hallo!
Ich stehe mal wieder hilflos vor einem langen Javascript.
Kann mir jemand erklären, wie man in einer Funktion auf eine Variable aus einer anderen Funktion zugreifen, also diese global verwenden kann?
Nach einigen Recherchen habe ich schon versucht, das "var" vor der Variable wegzulassen, dann funktioniert aber leider die Funktion nicht mehr.
Die Funktion, deren Variablen ich verwenden möchte sieht folgendermaßen aus:
function getvariablen() {
var currentScrollwidth, currentScrollheight;
if( typeof( window.pageYOffset ) == 'number' ) {
//Netscape compliant
currentScrollheight = window.pageYOffset;
currentScrollwidth = window.pageXOffset;
} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
//DOM compliant
currentScrollheight = document.body.scrollTop;
currentScrollwidth = document.body.scrollLeft;
} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
//IE6 standards compliant mode
currentScrollheight = document.documentElement.scrollTop;
currentScrollwidth = document.documentElement.scrollLeft;
}
var Weite, Hoehe;
if( typeof( window.innerWidth ) == 'number' ) {
//Non-IE
Weite = window.innerWidth;
Hoehe = window.innerHeight;
} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
//IE 6+ in 'standards compliant mode'
Weite = document.documentElement.clientWidth;
Hoehe = document.documentElement.clientHeight;
} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
//IE 4 compatible
Weite = document.body.clientWidth;
Hoehe = document.body.clientHeight;
}
return [ currentScrollwidth, currentScrollheight ];
return [ Weite, Hoehe ];
}
Vielen Dank schonmal!
Hallo Max,
in dem Du die Variablen aus dem Retrun der Funktion nimmst - hier also ein Array. Globale Variablen solltest Du nur sehr sparsam bis gar nicht nutzen, da sie eben überall sichtbar und somit manipulierbar sind.
return [ currentScrollwidth, currentScrollheight ];
return [ Weite, Hoehe ];
Ich lern ja immer wieder dazu aber wann tritt bei Dir das zweite return ein? Das erste beendet doch bereits die Funktion, sodass das zweite nie erreicht wird.
Mit freundlichem Gruß
Micha
Danke für den Tipp.
Ich habe jetzt mal alle vier Variablen von return ausgeben lassen:
return [ currentScrollwidth, currentScrollheight, Weite, Hoehe ];
In der nachfolgenden Funktion kann ich aber leider nicht auf die Variablen zugreifen ("currentScrollwidth is not defined"):
function scrollWestMid()
{
if(currentScrollwidth < Weite)
{
window.scrollBy(20,0);
var speed = 1;
var callee = arguments.callee;
window.setTimeout(function(){
callee();
}, speed);
}
}
Noch eine Idee, woran das liegen könnte?
Danke nochmal
Hallo Max,
Ich habe jetzt mal alle vier Variablen von return ausgeben lassen:
return [ currentScrollwidth, currentScrollheight, Weite, Hoehe ];
Okay.
In der nachfolgenden Funktion kann ich aber leider nicht auf die Variablen zugreifen ("currentScrollwidth is not defined"):
In der nachfolgenden Funktion hast Du die vorherige Funktion ja auch nicht aufgerufen; folglich stehen Dir auch die Rückgabewerte nicht zur Verfügung.
Vielleicht sollte ich das etwas mehr betonen. Variablen, die innerhalb einer Funktion mit var deklariert werden, sind nur dort sichtbar. In einer anderen Funktion kann aus diesem Grund der selbe Variablenname wieder verwendet werden _ohne_ das die beiden Variablen etwas miteinander zu tun haben.
Deine Funktion gibt darüberhinaus ein Aray zurück und keine einzelnen Variablen. In dem Array stehen am Ende die Werte, die innerhalb der Funktion noch in den lokalen Variablen standen.
function foo() {
// Anweisungen, die Variabeln belegen...
return [ currentScrollwidth, currentScrollheight, Weite, Hoehe ];
}
function bar() {
var arr = foo(); // bekommt das zurückgegebene Array von foo()
var currentScrollwidth = arr[0];
var currentScrollheight = arr[1];
// usw.
}
Mit freundlichem Gruß
Micha
Hallo,
function foo() {
// Anweisungen, die Variabeln belegen...
return [ currentScrollwidth, currentScrollheight, Weite, Hoehe ];
}function bar() {
var arr = foo(); // bekommt das zurückgegebene Array von foo()
var currentScrollwidth = arr[0];
var currentScrollheight = arr[1];
// usw.
}
Das sieht wie PHP aus - obwohl ich das selbst in PHP mit assoziativen Arrays oder stdObjects lösen würde. ;)
Jedenfalls sind Arrays bei sowas ziemlich umständlich, weil die Reihenfolge eine Rolle spielt - arr[0] usw. ist wenig bedeutungsvoll und nicht aussagekräftig beim Lesen des Codes. Deshalb ist es mit Objects - ungeordneten Name-Wert-Listen - eleganter:
// { name : wert, ... } erzeugt ein Object
return {
"currentScrollwidth" : currentScrollwidth,
"currentScrollheight" : currentScrollheight,
"Weite" : Weite,
"Hoehe" : Hoehe
};
Dann einfach:
var obj = get();
alert(obj.currentScrollwidth);
alert(obj.Weite);
usw.
Mathias
Hallo molily,
Das sieht wie PHP aus
Was?
Jedenfalls sind Arrays bei sowas ziemlich umständlich [...] Deshalb ist es mit Objects eleganter
Ja, das strimmt.
Mit freundlichem Gruß
Micha
Habe mal versucht die object-Methode anzuwenden.
Leider gibt mir Bugzilla jetzt folgenden Error aus: "get is not defined".
Mein Quelltext:
.
.
.
return {
"currentScrollwidth" : currentScrollwidth,
"currentScrollheight" : currentScrollheight,
"Weite" : Weite,
"Hoehe" : Hoehe
}
}
function scrollWestMid()
{
var obj = get();
if(obj.currentScrollwidth < obj.Weite)
{
window.scrollBy(20,0);
var speed = 1;
var callee = arguments.callee;
window.setTimeout(function(){
callee();
}, speed);
}
}
.
.
.
Habe ich irgendwas falsch umgesetzt?
Danke
Habe ich irgendwas falsch umgesetzt?
Ja, es gibt keine Funktion get().
Struppi.
Hallo,
Habe mal versucht die object-Methode anzuwenden.
Leider gibt mir Bugzilla jetzt folgenden Error aus: "get is not defined".
Das war nur ein Beispielname, so wie »foo« es in Michas Beispiel war. In deinem geposteten Code hieß die Funktion getvariablen.
Mathias
Jedenfalls sind Arrays bei sowas ziemlich umständlich, weil die Reihenfolge eine Rolle spielt - arr[0] usw. ist wenig bedeutungsvoll und nicht aussagekräftig beim Lesen des Codes. Deshalb ist es mit Objects - ungeordneten Name-Wert-Listen - eleganter:
eleganter ja, aber für sehr häufig genutzte Funktionen u.U. zu langsam.
Struppi.