nur falls in den inneren Funktionen
eval()
_nicht_ vorkommt, kann die Engine entscheiden
Das ändert nichts an dem Problem, dass ich zur Compile-Time nicht weiß, wie bestimmte Identifier zur Run-Time auflösen werden.
Ich kann bei der Kompilation alle Identifier heraussuchen und schauen, welche lokalen Variablen deklariert werden. Für die Identifier, die sich nicht mit den letzteren überschneiden, muss die Scope Chain jenseits des inneren Variable Objects abgearbeitet werden. Bei der Ausführung könnte ich dann nur diese konservieren und die restlichen sofort per GC entsorgen. Soweit hast du Recht.
Bei der eval-Frage müsste ich zur Compile-Zeit nach allen Referenzen auf eval suchen. Das wird m.W. erst in ECMAScript 5 ermöglicht, weil es da eine Unterscheidung zwischen Direktaufruf über den Identifier »eval« und dem indirektem Aufruf gibt (z.B. var myEval = eval; myEval('code')). Vgl. 10.4.2 und 15.1.2.1.1 vom Final Draft. So eine Unterscheidung haben manche Browser schon eingebaut:
var e = eval;
(function () {
var lokVar = "lokale Variable";
window.onload = function closure () {
var u = eval;
alert(eval('typeof lokVar') + ' ' + u('typeof lokVar') + ' ' + e('typeof lokVar'));
}
})();
Ergibt je nach Browser
string string string
oder
string undefined undefined
Letzteres ist, soweit ich das verstehe, ECMAScript-5-konform - da Squirelfish letzteres ausgibt, muss ich dir Recht gegen, dass er eine solche Optimierung prinzipiell vornehmen könnte.
Vielleicht senden wir mal so eine Frage an die Webkit-Dev-Liste? Das würde mich doch interessieren!
Mathias