3 Stimmen

javascript-abschlüsse und funktionsplatzierung

Wirkt sich die Platzierung einer Funktion auf die Leistung von Abschlüssen innerhalb des Geltungsbereichs aus? Wenn ja, wo ist der optimale Ort für die Platzierung dieser Funktionen? Wenn nicht, ist die implizite Assoziation durch eine Schließung Grund genug, eine Funktion logischerweise an einem anderen Ort zu platzieren?

Zum Beispiel, wenn foo ist nicht auf den Wert von localState ist die Tatsache, dass localState ist erreichbar von foo haben Auswirkungen auf foo die Ausführungszeit, den Speicherverbrauch usw.?

(function(){
    var localState;

    function foo(){
        // code
    }

    function bar(){
        // code
        return localState;
    }
})();

Mit anderen Worten: Wäre dies die bessere Wahl, und wenn ja, warum?

(function(){
    function foo(){
        // code
    }

    var localState;

    function bar(){
        // code
        return localState;
    }
})();

Darius Bacon hat vorgeschlagen unter dass die beiden oben genannten Proben identisch sind, da localState kann von jeder Stelle des Blocks aus aufgerufen werden. Das folgende Beispiel zeigt jedoch, dass foo außerhalb des Blocks definiert ist, kann ein anderer Fall sein. Was meinen Sie dazu?

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();

5voto

Claudiu Punkte 215027

Diese beiden Schnipsel sind gleichwertig, da sie beide in der (gleichen) Umgebung der anonymen Funktion, die Sie erstellen, definiert sind. Ich denke, dass Sie in der Lage sein werden, auf localState von foo so oder so.

Davon abgesehen... wenn Sie absurde Mengen von Variablen in der Umgebung haben, die Sie erstellen, dann foo könnte die Ausführungszeit beeinträchtigt werden, da die Variablensuche wahrscheinlich länger dauert. Wenn es viele Variablen gibt, die Sie in der von Ihnen definierten Funktion nicht mehr verwenden foo in, und foo sie auch nicht braucht, dann foo dazu führen, dass sie nicht in den Müll wandern, was ebenfalls ein Problem darstellen könnte.

5voto

Andrew Hedges Punkte 21406

Dog, ich würde hoffen, dass die Reihenfolge der Deklarationen wäre etwas, das die JavaScript-Interpreter würde abstrahieren. In jedem Fall, wenn es einen Leistungsunterschied, wäre es so minimal, dass dies ein Aushängeschild für die Übel der verfrühten Optimierung zu machen.

3voto

WPWoodJr Punkte 975

Jede Funktion in Javascript ist eine Schließung. Die Laufzeit zur Auflösung des Wertes einer Variablen fällt nur an, wenn die Variable von der Funktion referenziert wird. So erfasst in diesem Beispiel die Funktion y den Wert von x, obwohl x nicht direkt von y referenziert wird:

var x = 3;
function y() eval("x");
y();
3

2voto

questzen Punkte 3208

Ich glaube nicht, dass es einen Performance-Overhead geben würde, da Java-Skript nicht den Begriff des Funktionsstapels verwendet. Es unterstützt lexikalisches Scoping. Derselbe Zustand wird bei allen Closure-Aufrufen weitergeführt. Nebenbei bemerkt, in Ihrem Beispiel scheinen Sie keine Anweisungen auszuführen!

1voto

Darius Bacon Punkte 14645

Der Geltungsbereich einer var- oder Funktionsdeklaration ist der gesamte Block, in dem sie erscheint, unabhängig davon, an welcher Stelle des Blocks sich die Deklaration befindet; es wäre also überraschend, wenn sie die Effizienz beeinträchtigen würde.

Das heißt, es sollte keine Rolle spielen, ob "function foo()" vor oder nach "var localState" in diesem Block steht. Es puede Es spielt keine Rolle, ob sich die Funktion foo() in diesem Block oder in einem anderen Block befindet (wenn sie in einen höheren Bereich verschoben werden kann, weil sie keine jede lokale Variablen); das hängt von den Details Ihres Javascript-Compilers ab.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X