Hallo,
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 leuchtet ein.
> Das ist wie bei Events. Gibt man diese als String an, ist this windows. Gibt man sie als Funktionsreferenz an, ist this das Element.
> ~~~javascript
<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
Ok. das könnte man jetzt noch ergänzen mit dem Stringaufruf onclick="func2(this)", dann hätte man das "this" wieder eingefangen vom aufrufenden Element.
<script>
function func() {
alert(this);
}
function func2(callingElement) {
alert(callingElement);
}
window.onload = function () {
document.getElementById("test").onclick = func; // [object Object]
}
</script>
<body>
<button onclick="func()">[object Window]</button>
<button id="test">[object HTMLButtonElement]</button>
<button onclick="func2(this)">[object HTMLButtonElement]</button>
</body>
Frägt sich allerdings, warum da das "this" in dem String überhaupt als "this"-des-Elements interpretiert wird...;
Gruß
jobo