Hallo,
Achtung! Böse Falle. ;-) Die beiden Codebeispiele sind nicht identisch. Im ersten wird die Funktion update mit dem _Wert_ der Variable id als Argument aufgerufen, also bspw.: var id=5; ... attrib.nodeValue = "update(" + id + ");";, dann wird update(5) aufgerufen.
Im zweiten Beispiel wird die Funktion update mit der Variablen id als Argument aufgerufen, also update(id). Die Variable id ist dabei, wenn sie nicht global ist, aus dem Gültigkeitsbereich der Funktion, welche das select.onchange = function() {update(id);}; ausführt.
Eventuell muss hier also, je nach Art und Bedeutung der Variablen id, ein Function Object erzeugt werden.
Kleine Erbsenzählerei:
»new Function(...)« erzeugt genauso ein Function-Objekt wie die Function-Expresson »function (...) {...}«.
Der Unterschied ist, dass erstere Methode keine Closure erzeugt. Sprich, die erzeugte Funktion hat keinen Zugriff auf die Variablen der Funktion, in der sie erzeugt wurde.
<script language="JavaScript">
<!--
(Übrigens, bitte kein code lang=html verwenden und dann den JavaScrpt-Code durch einen Kommentar komplett ausgrauen - das ist nicht so toll lesbar. Dafür gibts code lang=javascript, das man in der anderen code-Auszeichnung verwenden kann.)
function init() {
var a = document.forms[0].tf1
var b = document.forms[0].tf2
var id = 123;
a.onchange = function() {update(id);};
//a.onchange = new Function("update(" + id+ ")");id = 456;
b.onchange = function() {update(id);};
//b.onchange = new Function("update(" + id+ ")");
}
Genau, die erste Notation erzeugt eine [Closure](http://blog.morrisjohns.com/javascript_closures_for_dummies), die zweite jeweils nicht.
Die Variable id in den erzeugten onchange-Funktionen und die in der init-Funktion sind identisch, sie verweisen intern auf dieselbe Speicherstelle - auch nach dem Ablauf der init-Funktion.
Ein anderes Beispiel:
~~~html
<script type="text/javascript">
[code lang=javascript]function init () {
var i = 0;
document.getElementById("button1").onclick = function () {
alert(i);
i++
};
document.getElementById("button2").onclick = function () {
alert(i);
i++
};
i = 1;
}
window.onload = init;
</script>
<button id="button1">A</button>
<button id="button2">B</button>[/code]
(Das doppelte Notieren der Funktion ist nicht nötig, hier zur Anschaulichkeit.)
Das kann man sich nicht erklären, ohne Closures zu verstehen. i ist keine globale Variable, aber beide Funktionen haben auf ein und dieselbe i-Variable Zugriff. Und der Wert beim ersten Ausführen ist der Wert, den die Variable am Ende der Funktion hatte, in der die Closure notiert wurde.
Mathias