Was sicher funktioniert, ist meine ursprünglich gepostete Version
window.onload = function () {
var wrapper = { .... };
wrapper.init();
};
Das ist ok, onload bekommt eine Funktionsreferenz.
> Und – das könnt ihr mir hoffentlich bestätigen – auch folgende Variante funktioniert:
>
> `window.onload = function () { ({...}).init(); };`{:.language-javascript}
>
> Ist ja auch logisch, weil onload jetzt eine richtige Funktion ist.
Nein das funktioniert nicht, neben der falschen Klammerung, weist du onload keine Funktionsreferenz zu, sondern den Rückgabewert der Funktion init()
> Es kommt auch hier erwartungsgemäß zu einem Fehler, wenn man gleich danach » Was m.M.n tatsächlich funktionieren könnte, wäre gemäß Mathias:
> > `window.onload = ({ ... }).init;`{:.language-javascript}
> Aber das klappt nicht (Fehler: DOM-Element hat keine Eigenschaften). Kann mir jemand sagen, warum nicht?
Weil du beim erzeugen des Objektes mit { ...} bereits die DOM Funktionen aufrufst, du hängst zu sehr an dem onload, was du du genau machst ist folgendes:
var objekt = {
ini: function() { .... },
inputField: document.getElementById("InputField"),
actionButton: document.getElementById("ActionButton")
};
window.onload = objekt.init;
ist im Prinzip richtig, nur das document.getElement.. zu früh auferufen wird.
> Der von Mathias genannte Code
>
> > `(function () { var obj = {... }; addLoadEvent(obj.init); })();`{:.language-javascript}
>
> sieht auch interessant aus.
Hier geht es nur um die Kapselung von obj, deshalb wird eine anonyme Funktion drumherum gebaut, die aber sofort aufgerufen wird.
> `window.onload = function () { ({...}).init(); };`{:.language-javascript}
Das ist falsch und funktioniert nicht zumindest nicht so wie du denkst.
>
> begnügen, und die addLoadEvent-Chose erst mal außen vor lassen, bis sich eine Notwendigkeit dafür ergibt.
>
> Mancher fragt sich jetzt vielleicht, warum ich überhaupt so viel Aufhebens darum mache. Naja, ich will halt javascript richtig verstehen, und möglichst einfachen und übersichtlichen Code produzieren. Jede Klammer oder Variable, auf die man eigentlich verzichten könnte, ist mir dann auch zuviel.
Du benutzt zuviele Klammern, d.h. dein Code funktioniert nicht, die Beispiele von Mathias sind richtig und funktionieren und enthalten mit Sicherheit keine überflüssigen Klammern. Die Frage ist nur wie unübersichtlich es man sich selber macht. Wenn ich einen Event mit einer komplexen Funktion aufrufen will, bau ich mir eine entsprechende Referenz und weise sie dem Handler getrennt zu, finde ich manchmal übersichtlicher
~~~javascript
var myHandler = function() {
/* tu viele Dinge, wenn die Funktion aufgerufen wird * /
};
object.onevent = myHandler;
Das Problem mit der gewünschten Kapselung erreichst du aber nicht anders.
(function() {
/* Diese Funktion wird sofort aufgerufen */
})()
und hier kannst du keine Klammern weglassen.
Struppi.