Bütschgi: Warum ist das so?

Hallo

Bin soeben gestolpert. Im folgenden (vereinfachten) Code habe ich erwartet, dass zuerst '0' angezeigt wird – da foo ja lokal definiert ist – dann aber '2', da der Block mit 'var foo' gar nie ausgeführt wird!?

  
var foo = 0;  
function test (bar) {  
 if (bar) {  
  var foo;  
  foo = 1;  
 } else {  
  foo = 2;  
 }  
}  
test(true);  
alert(foo);  
test(false)  
alert(foo);  

Die Zeile var foo wird offenbar in jedem Fall ausgeführt. Wieso ist das so? Was habe ich bis jetzt verpasst – oder bin ich von allen guten Geistern verlassen?

Danke für die Antworten.

  1. Die Zeile var foo wird offenbar in jedem Fall ausgeführt. Wieso ist das so?

    Siehe z.B. </archiv/2008/9/t176493/#m1161369>

    Mathias

    1. Siehe z.B. </archiv/2008/9/t176493/#m1161369>

      Also werden alle Variable Statements ausgeführt, wenn der Funktionskörper 'betreten' wird, auch wenn die Variable Statements in einem weiteren Block Statement stehen.
      Finde ich nicht besonders logisch – scheint aber so zu sein.

      Folgefrage:
      Wie kann ich mir dann die Variablendeklaration sparen, wenn sie nicht benötigt wird?

      Pseudocode:

        
      function computeValue (val) {  
          if (resultCached){  
              return resultFromCache;  
          } else {  
              var foo = {}, bar = 'blablubb';  
              [...]  
          }  
      }  
      
      

      Wenn jetzt die Funktion computeValue() sehr oft ausgeführt wird, wäre es doch sparsamer, die Variablendeklaration nicht durchzuführen.

      1. Also werden alle Variable Statements ausgeführt, wenn der Funktionskörper 'betreten' wird, auch wenn die Variable Statements in einem weiteren Block Statement stehen.

        Richtig.

        Wie kann ich mir dann die Variablendeklaration sparen, wenn sie nicht benötigt wird?

        Gar nicht - höchstens, indem du den Teil der Funktion in eine weitere Funktion kapselst oder auslagerst.
        Da die Variable Statements ohnehin immer ausgeführt werden, kannst du sie auch direkt am Funktionsanfang notieren, auch wenn die Variable nie genutzt werden.

        Wenn jetzt die Funktion computeValue() sehr oft ausgeführt wird, wäre es doch sparsamer, die Variablendeklaration nicht durchzuführen.

        Im Prinzip ja, aber vermutlich fällt das überhaupt nicht ins Gewicht. Wenn es jetzt tausende Variablen wären, würdest du vielleicht sehen können, dass etwas mehr Speicher verbraucht wird. Aber einerseits handelt es sich um leere Variablen, also sind es nur Hüllen, die angelegt werden, andererseits werden sie beim Ablauf der Funktion direkt wieder gelöscht. Ich vermute, dass die heutigen JavaScript-Interpreter solche Kleinigkeiten wegoptimieren. Aber du kannst ja mal testen, ob Performance-Einbußen zu verzeichnen sind.

        Mathias

  2. Hallo

    Im folgenden (vereinfachten) Code habe ich erwartet, dass zuerst '0' angezeigt wird – da foo ja lokal definiert ist – dann aber '2', da der Block mit 'var foo' gar nie ausgeführt wird!?

    Und - ist deine Erwartung erfüllt worden? Was ist dein Problem?

    Kalle

    1. Hi

      Und - ist deine Erwartung erfüllt worden? Was ist dein Problem?

      Nein, nicht erfüllt, denn wird zweimal '0' angezeigt. Und das ist (war) auch mein Problem.