JavaScript [best practice] Sollte man vermeiden, Variablen neu zu erzeugen?

T

Tersus

Gast
Guten Abend,

sollte man vermeiden, Variablen, deren Inhalt gleich bleibt, neu zu erzeugen?

Meine Variable myVariable wird ausschließlich in myFunction benötigt und wird über die gesamte Laufzeit einen Wert haben, der sich nicht ändert. Der Wert ergibt sich aber erst später. Quasi eine späte Konstante. myFunction könnte aber mehrmals aufgerufen werden.

Sollte ich
Code:
function myFunction(){
  var myVariable = ...;
  myVariable.doSomething;
}

vermeiden und statt dessen

Code:
const myVariable = ...;
function myFunction(){
    myVariable.doSomething;
}

verwenden? Problem ist, dass die Variable dann für alle sichtbar ist.

Oder sollte ich es so handhaben?
Code:
function myFunction(){

  if(typeof myVariable === 'undefined'){
    const myVariable = ...;
  }
  myVariable.doSomething;
}

Oder ist es prinzipiell schlecht, so kleinkariert zu sein?

Grüße

EDIT: Im Fall 1. Codeblock würde ich mit jQuery jedes mal ein neues jQuery-Objekt erzeugen, dass semantisch äquivalent ist.
 
Zuletzt bearbeitet von einem Moderator:
Tersus schrieb:
Problem ist, dass die Variable dann für alle sichtbar ist.

Da hast du schon das Problem. Es ist keine gute Idee, deinen globalen Scope zuzumüllen, nur um die Variable nicht lokal definieren zu müssen. Wenn etwas nur im lokalen Scope gebraucht wird, dann mache es auch nur dort sichtbar.

Tersus schrieb:
Oder sollte ich es so handhaben?

In der Regel sollte ja klasglar sein, ob die Variable an dieser Stelle zum Zeitpunkt der Nutzung definiert ist oder nicht. Was du da also machst klingt nach "ich weiß gar nicht was mein Code so tut, also baue ich da noch eine Überprüfung ein".

Es gibt natürlich auch Ausnahmen. Eine Datenbankverbindung (oder andere Ressourcen) bei jedem Funktionsaufruf neu zu erstellen ist nicht Sinn der Sache.

edit:

Meine Variable myVariable wird ausschließlich in myFunction benötigt und wird über die gesamte Laufzeit einen Wert haben, der sich nicht ändert.

Dann würde ich sagen "es kommt drauf an". Wenn die Initialisierung relativ teuer ist, dann kann es schon Sinn machen, die Variable doch im äußeren Scope zu halten.
 
Zuletzt bearbeitet:
Du kannst Variablen einfach in einem Funktions-Closure verstecken. So kann man allgemein Daten geheim halten (auch ohne Klassen etc.).
Code:
myFunction = (function() {

  const bla = 1;
  const blub = 2;

  return function() {
    return bla + blub;
  };

}());

Man kann sich Closures wie eine "Liste von benötigten Variablen" vorstellen.
In diesem Fall hält der Closure der "inneren" Funktion zwei Variablen. Der wird beim Erzeugen der Funktion (bzw. dem Funktions-Objekt) ein einziges mal erstellt und fest mit der Funktion verbunden. So könnte man die Daten auch mit anderen Funktionen "teilen", da ein Closure eigentlich nur Referenzen hält.
Das ist auch der Trick mit dem praktisch alle JavaScript Modul-Systeme arbeiten.

In der Praxis muss man sich bei einfachen, statischen Werten (nummern, kurzen Strings, ...) keine Gedanken machen. Das ist so ziemlich das erste, was eine Javascript VM optimiert. Generell sind JIT-Compiler dafür gebaut, gleichbleibende Dinge zu erkennen und wegzuoptimieren. Und ich würde ich auch immer erst auf Lesbarkeit achten (wenig Code duplizieren).
 
Zurück
Oben