Hallo,
Dann habe ich das jetzt mal alles in eine eigenes Objekt verpackt, um den allgemeinen Namensraum nicht zu verschmutzen. Und definiere im Timeout eine Funktion, die eine Objektmethode aufruft, um das "this" korrekt zu erhalten:
Weil du ja die Objektorientierung ins Spiel gebracht hat, könnte man jetzt einwenden, daß in diesem Fall eigentlich nur bgColorChange-Methode nach aussen sichtbar sein sollte, da alles andere eigentlich interne States sind.
Am Ende kann man dann auf ein eigenes Objekt verzichten. ;-)
function createColorHandler(elem, prop, red, redRange, green, greenRange, blue, blueRange) {
function createColorObj(v, r) {
var value = v;
var max = v;
var range = r;
var dir = 1;
return function() {
if (value <= max - range || value >= max) {
dir *= -1;
}
value += dir;
return value;
};
}
var red = createColorObj(red, redRange);
var green = createColorObj(green, greenRange);
var blue = createColorObj(blue, blueRange);
return function() {
elem[prop] = "RGB(" + red() + "," + green() + "," + blue() + ")";
};
};
window.onload = function () {
var myBody = document.getElementsByTagName("body")[0];
window.setInterval(createColorHandler(myBody.style, "backgroundColor", 255, 55, 168, 10, 136, 16), 120);
};
Macht es aber Sinn, den colorHandler immer wieder neu zu kreiren/createn? Kann es grad nich testen, aber werden dadurch Werte nicht wieder überschrieben? Ansonsten höre ich Crockford sagen: "JS is about functions". Hatte hier mal seine Memoizer-Funktion im Forum platziert: <http://forum.de.selfhtml.org/archiv/2011/5/t204981/#m1388909>. Und in dem Sinne aus meiner Sicht: Ist auf jeden Fall eine sehr feine Optimierung!
Gruß
jobo