2016-10-18 3 views
2

was ist der Vorteil einer Funktionsdefinition wie folgt aus: obj = { func: function(){return function func(){return this.something;};}() }Anvantage der Selbst rufenden Funktion in Funktionsdefinition

Story: Ich wurde nach einem Weg suchen, wie man eine Three.js Vector3 um einen bestimmten Winkel um eine Achse zu drehen, und fand dies: How to rotate a Three.js Vector3 around an axis? Ich war daran interessiert, wie die Funktion funktioniert und nachgeschlagen: https://github.com/mrdoob/three.js/blob/master/src/math/Vector3.js. Die Funktion sieht so aus:

applyAxisAngle: function() { 

    var quaternion; 

    return function applyAxisAngle(axis, angle) { 

     if (quaternion === undefined) quaternion = new Quaternion(); 

     return this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle)); 

    }; 

}(), 

Also was ist der Grund für diese Art der Definition einer Funktion?

+0

In Anbetracht der Position von 'd' und' n', 'Vorteil' ist etwas Tippfehler – Rajesh

+3

Vorteil ist es,' Quaternion' zu verstecken. 'applyAxisAngle' kann es verwenden, aber niemand sonst. – Maxx

Antwort

2

Der sofort aufgerufene Funktionsausdruck (IIFE) lässt den Autor dieses Codes der applyAxisAngle-Funktion eine wirklich private quaternion-Variable geben, die sonst nirgendwo zu sehen ist.

Dieser Code im Grunde tut dies:

var quaternion; 

// ... 

applyAxisAngle: function applyAxisAngle(axis, angle) { 

    if (quaternion === undefined) quaternion = new Quaternion(); 

    return this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle)); 
}, 

... aber halten quaternion ganz privat, anstatt es mit dem Code in dem Rahmen zu teilen, wo all dies erscheint.

Es wird das Erstellen des Quaternion-Objekts bis zum ersten Aufruf des Objekts verzögert, und dann wird dieses Objekt in allen nachfolgenden Aufrufen wiederverwendet, indem der Wert aus dieser privaten quaternion-Variable verwendet wird.

2

Eigentlich wurde der Grund applyAxisAngle() so geschrieben, war nicht quaternion privat zu halten, obwohl das in der Tat ein Nebeneffekt der Implementierung ist.

Es wurde auf diese Weise geschrieben, um zu vermeiden, ein new Quaternion() bei jedem Aufruf der Methode instanziieren und folglich Garbage Collection vermeiden.

applyAxisAngle() wird oft in engen Schleifen aufgerufen - viele Male pro Sekunde. Wenn Sie die Methode auf diese Weise schreiben, wird die Quaternion nur einmal instanziiert.

Das implementierte Konstrukt wird als "Schließung" bezeichnet.

Verwandte Themen