Aber sie ist im window.onload definiert, genau wie auch setIntervall. Macht es denn einen Unterschied, welche der beiden Schreibweisen ich verwende? Für den Scope (Closure) doch wohl nicht, oder? Zumal es ja auch erst mit der Stringschreibweise ging ...;
Doch, genau für die Closure macht es den Unterschied.
Du hast im Prinzip
var func = new Function("myBgColorChange()");
window.setInterval(func, 120);
Aus deinem String wird eine neue globale Funktion mit dem String als Body definiert, diese kennt dann aber natürlich deine Closure nicht mehr, da es ja eine Funktion im globalen Scope ist.
Das ist wie bei Events. Gibt man diese als String an, ist this windows. Gibt man sie als Funktionsreferenz an, ist this das Element.
<script>
function func() {
alert(this);
}
window.onload = function () {
document.getElementById("test").onclick = func; // [object Object]
}
</script>
<body>
<button onclick="func()">[object Window]</button>
<button id="test">[object HTMLButtonElement]</button>
</body>
Im 1. Fall ist Element.onclick = function(){
// this ist Element
func(); // func wird im globalen Kontext gerufen
}
Im 2. Fall ist Element.onclick = func;
Element.onclick() wird mit Kontext Element gerufen