Nicht jeder verfährt nach dem Konzept "Objekt ist gut™"
JavaScript tut es jedenfalls, weil alles ein Objekt ist.
Aber inwiefern ist das ein Einspruch gegenüber meinen Aussagen? Verfährst du nach dem Konzept »Objekt ist schlecht«? Okay, was ist denn schlecht daran?
Dementsprechend gebe ich aus verschiedenen, weiteren Gründen einer Einpassung von Code, also deren problemorientierten und zumeist nicht portablen Routinen, jedenfalls den Vorrang.
Inwiefern ist der Ansatz mit Funktionsnamen als Strings problemorientierter? Ich sehe keinen Overhead darin, das eine Schema des Event-Handlings mit Callback-Funktionen durchzuhalten. Das ist so ziemlich das einfachste und weit verbreiteste in JavaScript. Wenn man es einmal gerallt hat, und das muss man, weil eben halb JS darauf aufbaut, dann kann man damit sehr elegante funktionale Problemlösungen finden.
Die Nutzung von onload hat eben aus Gründen der Übersichtlichkeit und Wartbarkeit von Code i. V. m. einer zentralen Initialisierungsfunktion große Vorteile.
Ich will gar nicht sagen, dass das in jeden Fall Unsinn ist, und ja, es kommt auf den Anwendungsfall an. Ich verwende selbst oft zentrale Initialisungsfunktionen der Art:
window.onload = function () {
Dies.init();
Das.init();
Jenes.init();
};
-- wenn es denn zur Lösung des Problems ausreicht. Das stößt natürlich unglaublich schnell an seine Grenzen, wie man hier im Forum bei unzählig vielen JavaScript-Fragen sehen kann. Die Nachteile davon sind bekannt. Warum man das nicht im HTML unterbringt, ist auch hinreichend diskutiert. Ich habe schon öfters darüber geschrieben und kann nur auf meine zahlreichen Artikel verweisen.
Wenn man sich dieser Einschränkungen bewusst ist, ja, dann kann man obiges problemlos einsetzen. Wenn man aber ohnehin schon dazu übergeht, sich eine Helfer-Funktion à la »addLoadEvent« zu basteln, dann sollte man m.E. auch einen Schritt weiter gehen.
Obiges Modell halte ich nicht für per se wartbarer als das Notieren eines addEvents beim Modul selbst. Das ist zum Teil schlicht Gewohnheit. Manche wollen Zusammenhängendes nahe beieinander, also auch die Registrierung der Init-Funktionen. Bei wenigen Scripten ist das auch problemlos zentral zu verwalten. Sobald man aber mehrere Scripte aus verschiedenen Quellen hat, die auf einer Site auch nicht alle notwendig gleichzeitig eingebunden und initialisiert werden, ist eine Modularisierung angebracht.
Das geht meiner Erfahrung nach recht schnell - Grund genug für mich, Anfängern dazu zu raten, sich bereits recht früh in die fortgeschrittenen Methoden einzuarbeiten, weil sie früher oder später in die hinreichend bekannten Fettnäpfchen treten werden. Dafür, dass die meisten Leute heutzutage wohl JavaScript mit jQuery und Co. lernen, ist dieser Ansatz noch äußerst bodenständig. Wenn du dir mal meine JS-Doku anschaust, wirst du sicher erkennen, dass ich keinesfalls grundlos überkomplexe Lösungen empfehle. Ich verschweige aber auch nicht die Nachteile von einfachen und zeige flexiblere auf.
In einer Initialisierungsfunktion kann ich ganz einfach mittels alert(initial_array)
und ähnlichen Hilfsmitteln mir sehr schnell einen Überblick verschaffen.
Die Modulverwaltung meines Forumsscriptes funktioniert ähnlich - wenn auch vornehmlich aus anderen Gründen (es gibt verschiedene Seiten und ein Modul muss nicht notwendig bei allen Seiten initialisiert werden).
Richtig: <body onload="initial_funktion()">
Kein zusätzlicher workarounds für den IE notwendig, übersichtlich und wartbar.
Nein, es ist nicht gut wartbar, JS-Code mit den Dokumenten zu verschmelzen. Das Konzept der klaren Trennung von HTML, CSS und JavaScript (Semantisches Markup + CSS-Layout + Unobtrusive JavaScript) ist einfach die größte Errungenschaft im Webdesign. Da sich in einem ausgelagerten JS äquivalent window.onload = initial_funktion; notieren lässt (bzw. weitaus flexiblere Methoden existieren), besteht keine Notwendigkeit, das fest in alle Dokumente zu schweißen - und alle anpassen zu müssen, wenn sich das einmal ändert.
Triviale Probleme bedürfen keiner Objekte. Daran scheiden sich hier offensichtlich die Geister.
Ich empfehle hier eigentlich fast immer Low-Level-Lösungen, wenn es denn um triviale Probleme geht.
Vielleicht hast du das missverstanden, ich habe auf dein Posting ursprünglich nicht geantwortet, um eine alternative, auf den konkreten Fall des Fragestellers optimal zugeschnittene Lösung zu präsentieren. Vielmehr ging es mir um einen Ausblick auf - nun, eben »elegante« Lösungen, die sich an bestehenden funktionalen Programmiertechniken orientieren, in den restlichen JS-Gebrauch enschmiegen (addEvent kann man immer gebrauchen) und eine stärkere Flexibilität aufweisen. Darauf hinzuweisen halte ich für nötig angesichts dessen, dass eben nicht jeder Teilnehmer hier auf demselben Wissenstand ist.
Für das Originalproblem des Threads halte ich addEvent() für eine Alternative, Objekte, wie Du sie jetzt zum Argument instrumentalisierst, berühren das Thema IMHO jedoch gar nicht.
Wenn ich schon so weit bin, dass ich mehrere Initialisierungsfunktionen habe, dann hängen da meistens jeweils mehrere Funktionen und Variablen dran - Grund genug, diese in Objekten zu gruppieren (und sie bestenfalls konfigurierbar und wiederverwendbar zu machen). Das ist schlicht *die* JavaScript-typische Umsetzung - im Gegensatz zu vielen globalen Objekten mit Namespace-Präfixen im Namen.
Zudem steht immer noch Dein Einwurf bei einem Beispiel, der Performance wegen, dem entgegen, dass man lieber nicht mit Kanonen auf seine Spatzen schießen sollte.
Ich wüsste nicht, was an der Gruppierung von zusammenhängenden Funktionen und Variablen an einem Objekt-Literal unangemessen ist. Im Gegenteil, es verbessert die Übersichtlichkeit im Code enorm. Was hast du dagegen einzuwenden? Was ist daran komplex oder verschlechtert die Performance? Was bevorzugst du?
Letzteres verleitet einen nur dazu, den globalen Namespace ungeordnet vollzuballern, was man bestenfalls von Anfang an vermeiden sollte.
Das halte ich für kein diskussionswürdiges Argument, da es nur um einen einzigen Variablennamen geht.
Ich habe nicht von »f« aus deinem Beispiel gesprochen, sondern von den vielen globalen Funktion samt »Anhängen«.
Mathias, schreib, was Du willst!
Den Eindruck, gegen eine Wand zu reden, habe ich tatsächlich.
Mathias