2016-03-20 23 views
0

Angenommen, ich habe eine Funktion habe, dayToString, als solche definiert:Wird ein Array innerhalb einer JavaScript-Funktion bei jedem Aufruf neu erstellt?

function dayToString(n) { 
    return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][n]; 
} 

einfach genug. Verbrauch könnte in etwa so aussehen:

var d = new Date(); 

var todayAsString = dayToString(d.getDay()); 

Meine Frage ist, wird das Array innerhalb dayToString bei jedem Aufruf neu erstellt, oder wird er nur einmal erstellt?

bearbeiten

Eine Klarstellung: Ich weiß, wie manuell über einen Verschluss oder eine externe Anordnung dieser Neuzuweisung zu vermeiden. Um meine ursprüngliche Absicht zu verdeutlichen: Sind die aktuellen JavaScript-Engines (V8, SpiderMonkey, JavaScriptCore, Chakra, usw.) schlau genug, um zu erkennen, dass das Array statisch ist und es so behandelt? Gibt es vielleicht etwas in der JS-Spezifikation, das eine solche Optimierung verhindert?

Antwort

0

Ja, Sie definieren es und geben jedes Gespräch zurück. Um dies zu vermeiden, außerhalb der Funktion definiert werden:

var arrayOfDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 
function dayToString(n) { 
    return arrayOfDays[n]; 
} 
+0

Ich bin mir dieser Methode bewusst, um zu vermeiden, was wir für eine Neuzuweisung halten, aber ich meine, dass diese Frage mehr auf V8, JSC ausgerichtet ist und Freunde dieses statische Element in einer Funktion sehen und es so behandeln können . –

0

Ja, wird das Array jedes Mal neu erstellt.

Um das Array zu erstellen nur einmal möglich:

1) eine static property auf die Funktion emulieren:

dayToString.weekDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 
function dayToString(n) { 
    return dayToString.weekDays[n]; 
} 

2) Oder erstellen closure to keep the week days isoliert:

var dayToString = (function(n) { 
    var weekDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 
    return function(n) { 
    return weekDays[n]; 
    } 
})(); 
+0

Ein feiner Trick in Ihrem 2, den ich oft genug verwende, um in eine Funktion verallgemeinert zu werden, die ein Array nimmt und die Schließung zurückgibt, aber meine Frage sollte eher eine Frage sein, wie "smart" die JS-Engines sind. Erkennen sie, dass das Array von sich aus statisch ist und es so behandelt? –

+0

@HoagyCarmichael Es hängt von der Implementierung ab, und es besteht eine große Chance, dass der Motor diesen Teil optimieren kann. Aber ich werde dies nicht als Argument in der Codierphase betrachten, da die JavaScript-Spezifikation besagt, dass der Bereich jedes Mal beim Funktionsaufruf neu erstellt wird. –

0

Es hängt auf dem Laufzeit-Compiler. Die Frage kann also nicht mit Ja oder Nein beantwortet werden.

Aber ich sage, Nein, weil es nur eine Instanz der Funktion gibt und der Inhalt der Funktion statisch ist, in der Sicht des Compilers.

+0

Das ist die Art von Optimierung, die ich in Betracht gezogen habe, als ich die Frage gestellt habe. Ich bin nicht genug vertraut mit der Quelle von V8, JSC, usw., um herauszufinden, ob diese Optimierung in einer vernünftigen Zeitspanne durchgeführt wird, aber wenn Sie etwas haben, um Ihre Ansprüche zu untermauern, das ist es, wonach ich suche. –