dedlfix: jQuery Variablenübergabe (mal wieder)

Beitrag lesen

Tach!

Warum sollte ich hierfür das Element mehrfach speichern. Dies geht doch immer zu Lasten der Performance.

Es wird nicht mehrfach gespeichert, nur mehrfach referenziert.

Mach dir mal keinen allzu großen Kopf über die Performance bei solchen Kleinigkeiten. Eine einzelne Zuweisung einer Referenz auf ein Objekt bringt keinen Browser um. Viel wichtiger ist eine für den Menschen nachvollziehbare Programmierung der Lösung für die Aufgabenstellung.

Was vor allem spart, ist, Ergebnisse von DOM-Abfragen in Variablen abzulegen, wenn man diese mehrfach braucht, statt das DOM erneut danach zu befragen.

// mal ganz abgesehen davon, dass man die Methodenaufrufe auch chainen/verketten kann ...

var $foo = $('.foo');
$foo.text('bar');
$foo.click(function () {...});

// statt

$('.foo').text('bar');
$('.foo').click(function () {...});

Nebenbei: Bei jQuery gibt es eine ungeschriebene Konvention, dass man Variablen, die jQuery-Objekte referenzieren, mit einem $ beginnt. Dann weiß man, dass man darauf weitere jQuery-Methoden anwenden kann.

var $foo = $('#foo'); // jQuery-Objekt
var foo = $foo[0]; // plain old DOM object

// wir bauen uns noch eine Funktion...
function (_elem) {
    // _elem ist nun "gegen außen geschützt"
    tuWas(_elem);

}(elem); // ... und führen sie gleich aus (mit Parameter)

Trotzalledem ist dies ein sehr interessanter Ansatz. Danke dafür.

Dieser Ansatz nennt sich IIFE (immediately invoked function expression = sofort aufgerufener Funktionsausdruck) und hat üblicherweise noch ein Klammerpaar mehr (vor dem function und nach dem }). Das "gegen außen geschützt" ist so eine Sache. Da Objekte per Referenz übergeben werden, ist nur die Referenz selbst geschützt, nicht aber das Objekt. Das heißt, der Garbage Collector räumt das Objekt nicht weg, weil noch die Referenz in der IIFE darauf verweist (solange da was lebendes drin ist oder darauf referenziert). Aber überall da, wo man eine Referenz auf das Objekt hat, kann man seinen Inhalt ändern, denn der ist nicht "geschützt". Um ihn zu separieren, muss man einen Clone anlegen, der mehr oder weniger tief die Eigenschaften des Objekts und die Ziel-Objekte der von ihm gehaltenen Referenzen kopiert.

dedlfix.