Frage

Ist die Platzierung einer Funktion auf der Leistung von Verschlüssen im Umfang auswirken? Wenn ja, wo ist der optimale Ort, um diese Funktionen zu setzen? Wenn nicht, ist die implizite Assoziation durch Schließung Grund genug logisch eine Funktion in einem anderen Ort zu Ort?

Zum Beispiel, wenn foo stützt sich nicht auf den Wert von localState , wie die Tatsache, dass localState ist von foo haben Auswirkungen wie auf foo 's Ausführungszeit, Speichernutzung, etc.?

(function(){
    var localState;

    function foo(){
        // code
    }

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

Mit anderen Worten, dies wäre eine bessere Wahl sein, und wenn ja, warum?

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

    var localState;

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

Darius Speck vorgeschlagen unten , dass die beiden Proben sind oben identisch, da localState kann aus dem Block überall zugegriffen werden. Doch das Beispiel unter dem foo außerhalb des Blocks definiert ist, kann ein anderer Fall sein. Was denken Sie?

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();
War es hilfreich?

Lösung

Jede Funktion in Javascript ist ein Verschluss. Die Laufzeit lösen Wert einer Variablen nur dann, wenn die Variable anfallen wird durch die Funktion verwiesen wird. Zum Beispiel erfaßt in diesem Beispiel Funktion y den Wert von x obwohl x nicht direkt durch y verwiesen:

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

Andere Tipps

Diese beiden Schnipsel sind gleichwertig, weil sie definiert sind beide in der (gleichen) Umgebung der anonymen Funktion Sie erstellen. Ich denke, dass Sie in der Lage sein würden localState von foo jede Art und Weise zuzugreifen.

Dass gesagt wird ... wenn Sie absurde Mengen von Variablen in der Umgebung haben Sie erstellen, dann foo die Ausführungszeit betroffen sein könnte, als variable Lookups wahrscheinlich länger dauern. Wenn es Tonnen von Variablen, die Sie nicht mehr in der Funktion verwenden Sie definieren foo in und foo hat sie auch nicht braucht, dann wird foo verursachen sie nicht Garbage Collection sein, so dass auch ein Problem sein könnte.

Hund, würde ich die Reihenfolge der Erklärungen hoffen, etwas würde abstrahieren das JavaScript-Interpreter sein würde. Auf jedem Fall, wenn es ein Unterschied in der Leistung ist, wäre es so minimal sein, da dies zu einem Aushängeschild für die Übel der vorzeitigen Optimierung zu machen.

Das glaube ich nicht, dass es irgendwelche Performance-Overhead wäre, als Java-Skript nicht den Begriff der Funktion Stack verwenden. Es unterstützt lexikalisches Scoping. Der gleiche Zustand ist über Verschluss Anrufe durch her. Auf einer Seite zur Kenntnis, in Ihrem Beispiel Sie scheinen keine Aussagen zu der Ausführung!

Der Geltungsbereich einer Variablen oder Funktionsdeklaration ist der gesamte Block in angezeigt wird, unabhängig davon, wo in dem Block die Erklärung ist; so würde es überraschen, denn es Effizienz zu beeinflussen.

Das heißt, sollte es keine Rolle, ob „die Funktion foo ()“ vor oder nach „var localState“ ist innerhalb dieses Blocks. Es können egal, ob „die Funktion foo ()“ in diesem Block ist oder ein umschließt ein (wenn es zu einem höheren Umfang hochgezogen werden kann, weil es nicht mit jeder Lokal Variablen); das hängt von Details Ihrer Javascript-Compiler.

In Ihren Beispielen der Unterschied nicht wirklich wichtig. Auch wenn foo im globalen Bereich ist, werden Sie kein Problem haben.

Allerdings ist es sinnvoll, im Auge zu behalten, dass, wenn Sie den Stil der Zuordnung von Funktionen zu Variablen verwenden, um Ihre Funktionen der Reihenfolge zu erklären, in dem sie erklären sind durchaus ein Problem werden kann.

Für eine bessere Idee, versuchen Sie die folgenden zwei Beispiele:

CheckOne();
function CheckOne() {
    alert('check...check one.');
}

CheckTwo();
var CheckTwo = function() {
    alert('check...check two.');
};

Der einzige Unterschied zwischen der zweiten und der ersten ist der Stil verwenden, um sie ihre Funktionen zu erklären. Die zweite erzeugt einen Referenzfehler.

Prost.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top