Rolf B: function-Aufruf im requireModul

Beitrag lesen

Hallo effel,

ja, das geht so.

Die Funktion add ist im aufrufenden Code definiert und bildet dort ein Funktionsobjekt. Da kannst du als Argument überallhin übergeben (äh, nein, nicht überall, es muss der gleiche Realm sein, anders gesagt: an einen Worker übergeben kannst Du es nicht).

Im direct.js Modul kannst Du das Objekt dann zum Aufruf der Funktion verwenden.

Wenn Du add per function-Schlüsselwort definierst, ist der Wert in ihrem Scope festgelegt und du kannst sie nicht mehr durch eine andere Funktion überschreiben.

Was Du machen kannst, ist per let eine Variable zu definieren und der eine anonyme Funktion zuzuweisen.

let add = function(x,y) { return x+y; };
direct1.m(..., add);

add = function(x,y) { return x-y; };
direct1.m(..., add);

Hier würde m beim ersten Mal mit der Additionsfunktion und beim zweiten Mal mit der Subtraktionsfunktion aufgerufen.

ABER so sollte man das nicht machen, es sei denn, man möchte Putins Spione verwirren. Besser wäre es schon, von vorneherein zwei Funktionen zu definieren und je nach Bedarf die eine oder andere zu übergeben. Innerhalb von m sollte sie dann auch nicht add heißen, sondern einen sinnvollen Namen tragen. Du übergibst eine mathematische Operation, die durchzuführen ist, dann nenn das Ding operation. Wenn es in deinem echten Businesskontext einen besseren Namen gibt, dann wähle den.

Beachte auch, dass Funktionsobjekte den Scope, in dem sie definiert wurden, als Closure mitnehmen. Falls Du in direct1.m das Funktionsobjekt speicherst, kann das dazu führen, dass der Scope der Funktion länger existiert als erwartet. Das kann zu Speicherlecks führen.

function foo(modul) {
   const data = Array(10000);
   const q = 7;
   function add7(x,y) { return x+y+q; }
   modul.m(..., add7);
}

foo(direct1);

Normalerweise ist es so, dass die lokalen Daten von foo() nach dem Ende von foo() freigegeben werden. Aber: die add-Funktion nimmt ihren Scope mit, denn innerhalb von add() kannst Du auf diesen Scope zugreifen. Deshalb kann add7 auf q zugreifen, obwohl die m-Funktion in direct.js nichts davon sieht.

FALLS jetzt die m-Funktion das add7-Funktionsobjekt irgendwo längerfristig speichert, dann hängt da der Scope von add7 hinten dran. Und dazu gehört nicht nur q, sondern auch das data-Array! Eine gute Runtime-Engine kann sowas erkennen und die data-Referenz aus der Closure herausoptimieren (C# tut sowas). Aber ich weiß nicht, ob die aktuellen JavaScript-Engines das können.

Das ist aber schon ein Spezialfall. Solange Du die Funktionsreferenz nicht über die Dauer des Aufrufs von m hinaus speicherst, ist das alles egal.

Rolf

--
sumpsi - posui - obstruxi