2017-09-21 2 views
1

Ich weiß, dass es manchmal nützlich ist, um Funktionen andere Funktionen zurückzugeben, so dass Sie nicht wiederholen müssen, Modularität, etc.
Aber was ist der Punkt in diesem Snippet (einer von vielen) hier aus der three.js Bibliothek?Funktion zurückgebende Funktion als Eigenschaft

Object.assign(Matrix4.prototype, { 

... 

    applyToBufferAttribute: function() { 

     var v1 = new Vector3(); 

     return function applyToBufferAttribute(attribute) { 

      for (var i = 0, l = attribute.count; i < l; i ++) { 

       v1.x = attribute.getX(i); 
       v1.y = attribute.getY(i); 
       v1.z = attribute.getZ(i); 

       v1.applyMatrix4(this); 

       attribute.setXYZ(i, v1.x, v1.y, v1.z); 

      } 

      return attribute; 

     }; 

    }(), 

... 

}); 

Die 'inlined' applyToBufferAttribute erhält nicht anderswo wiederverwendet.

+0

Was ist: '...'? – zer00ne

+0

Könnte einfach ein Entwickler-Stil sein - machen Sie Ihren Code einfach wiederverwendbar/erweiterbar ist eine ziemlich gute Gewohnheit zu sein, weil in der Theorie macht es zukünftige Entwicklung einfacher. – Scoots

+0

Wenn ich dieses Recht lese, wird die 'applyToBufferAttribute' Methode auf die Funktion mit dem gleichen Namen gesetzt. Das einzige Ziel wäre hier, einen Vektor für jede Ausführung dieser Funktion zu erstellen, aber ich überlege warum, sobald der Garbage Collector zurückkommt, sollte er den lokalen Vektor haben, wenn es einen geben sollte. – Dellirium

Antwort

1

Die zurückgegebene Funktion wird zur Methode, ja. Der Zweck des Einschließens in ein IIFE ist das Verbergen der v1 Variable, was es C "statische Variable" nennen würde: egal wie viele Matrix4 Objekte Sie machen, egal wie oft Sie applyToBufferAttribute aufrufen, es wird nur eine Instanz geben von v1, und es wird nicht zugänglich sein, außer innerhalb der applyToBufferAttribute Funktion.

Der Zweck dass, können wir nur raten, an, aber wahrscheinlich Zuweisung und Freigabe Kosten für das Vector3 Objekt zu vermeiden, unter der Annahme, applyToBufferAttribute mit einer gewissen Häufigkeit aufgerufen wird. Da three.js eine WebGL-Bibliothek ist, hilft jede kleine Optimierung.

0

So "verstecken" Sie eine Variable zum äußeren Bereich.

v1 ist nicht mehr sichtbar außerhalb Ihres Moduls und Sie stellen sicher, dass niemand es manipulieren wird.

In der Regel ist die Rückkehrfunktion eine Schließung, die über die Variable v1 schließt.

Eine Alternative wäre, ein komplettes Fledge-Objekt zu machen und v1 readonly zu machen, aber Sie werden sich oft nicht bemühen, ein solches Objekt zu erstellen. So ist es ein schneller praktischer Weg, um einige Variablen zu kapseln. Eine zweite Alternative wäre das Hinzufügen des v1 zum Rückgabeobjekt.

function applyToBufferAttribute() { 
    if (!this.v1) { 
     this.v1 = new Vector3(); 
    } 
    ... 
} 

Aber das hat auch die Frage der Herstellung v1 sichtbar außen und macht Code zerbrechlicher.

Verwandte Themen