dedlfix: Funtion in Funktion Unterschiede Closures

Beitrag lesen

problematische Seite

Tach!

ich fand diesen Artikel, aber die Beispiele leuchten mir nicht ein.

function initAlert () {
   let msg = "Was noch zu sagen wäre";
   window.setTimeout (function () {alert (msg); }, 100);
}

ist langsamer als

function initAlert () {
    window.setTimeout ( function () {
        let msg = "Was noch zu sagen wäre";
        alert (msg);
    }, 100);
}

Aus welchem Grund soll die erste Version erheblich langsamer sein?

Die Frage zu erörtern ist müßig. Entweder braucht man die Funktionalität der Variable im äußeren Scope, dann muss man mit eventuell vorhandenen Einschränkungen leben. Oder man braucht sie nicht und kann sie lokal lassen.

Das zeitliche Verhalten braucht man meist nur in zeitkritischen Situationen zu beachten. Ansonsten verliert sich der Unterschied üblicherweise im Grundrauschen.

Ob wirklich ein Unterschied besteht, kann ich nicht sagen. Im ersten Fall wird die Variable im äußeren Scope nur einmal angelegt, aber bei jedem Callback wird sie im inneren und dann im äußeren Scope gesucht. Im zweiten Fall wird sie zwar beim Callback nur im inneren Scope gesucht, dafür aber immer wieder erneut angelegt. Das wird sehr abhängig von der jeweiligen Javascript-Engine sein, und wie Zugriffe auf die Scope Chain optimiert sind und wie Closures von der Engine im Allgemeinen gehandhabt werden.

Es kann sogar ein Vorteil sein, die Variable außen anzulegen, auch wenn sie dort nicht benötigt wird und auch intern nicht verändert wird. Das wäre dann der Fall, wenn die Ermittlung des Wertes aufwendig ist, wie beispielsweise die Suche eines Elements im DOM.

Und ist das wirklich so?

Aufgrund des alert ist das nicht messbar. Wenn das durch etwas ohne Nutzerinteraktion ersetzt wird, und es faktisch einen Unterschied gibt, wird er praktisch nicht relevant sein.

Außerdem scheint mir der Artikel trotz der Datierung auf 2018 schon etwas älter zu sein. Funktionen herumzureichen ist schon lange kein besonderes Merkmal von Javascript mehr. Und neben dem dort erwähnten Javascript-Interpreter gibt es schon länger Engines mit Kompilierfunktion, so dass man nicht mehr davon ausgehen kann, dass Javascript immer interpretiert wird.

dedlfix.