molily: Die wahreit um this?

Beitrag lesen

Wenn man das im "globalen Scope" notiert, dann hat man (Du nennst es "laut Sichtbarkeit") im Wesentlichen dem window-Objekt eine neue Methode spendiert: window.foo - oder nicht?

Ja.

Mir ist jetzt nicht klar, inwiefern hier keine Äquivalenz besteht. Ist es nur der Umstand, dass "function foo () {}" von der JS Engine anders "verstanden" wird, als "foo = function () {}"?

Es hat eine andere Bedeutung. function foo () {} deklariert eine Funktion, foo = function () {}; weist dem Identifier foo eine Funktion als Wert zu. Je nachdem, ob und wo foo deklariert wurde, ist der Effekt ein ganz anderer.

Nach meinem laienhaften Wissen ist letzteres eine Deltafunktion, die einer Variable zugewiesen wird,

Den Begriff »Deltafunktion« kenne ich persönlich nicht. In ECMAScript wird das Funktionsausdruck (Function Expression) genannt, allgemein Lambda.

und ersteres eine Funktionsdeklaration - aber wie genau muss man hier in die Tiefen einer JS-Engine gehen, um "äquivalent" sagen zu können?

Bei function foo () {} vs. foo = function () {} (ohne var davor, ohne vorherige Deklaration von foo) ist der Unterschied ein riesiger. Nämlich der zwischen lokalen und globalen Variablen, da muss man nicht in die Tiefen gehen.

Entweder ich bastle mir eine Variable, in die ich ein Funktionsobjekt (ist das dann eine "Deltafunktion"?) in der Art wie oben schmeiße, oder ich definiere mir eine Methode an ein Objekt.

Wenn man var foo = function () {}; schreibt, wäre es tatsächlich eine »Variable, in die ich ein Funktionsobjekt … schmeiße«. Dagegen ist ja nichts einzuwenden, solange man nicht das var vergisst.

Wozu also eine lokale Funktionsdeklaration? Und warum ist sie dann "lokal" und keine Eigenschaft des window-Objektes?

Funktionsdeklarationen erzeugenokale Funktionen, es sei denn, sie stehen im obersten Kontext. Das ist erst einmal so definiert und darüber hinaus auch durchaus sinnvoll.

Analog zu Deinem "laut Sichtbarkeit" müsste ich dann schreiben:

function foo () { function bar () { var w = this; } }
ist laut Sichtbarkeit äquivalent zu
window.foo = function () { var bar = function () { var w = this; }; };

Habe ich das jetzt richtig verstanden?

Ja, richtig.

Der Unterschied von function bar () {} zu var foo = function () {}; ist oft vernachlässigbar. Ein Unterschied ist das Hoisting, siehe https://forum.selfhtml.org/?t=208504&m=1418668. Ein anderer ist, dass die Funktion im zweiten Fall anonym ist.

Douglas Crockford rät von Funktionsdeklarationen per se ab und propagiert, stattdessen var f = function () {}; zu verwenden, damit man sich nicht um Hoisting Gedanken machen muss. Ich finde Hoisting bei Funktionsdeklaration hingegen nützlich, zumal man nicht wirklich um Hoisting herumkommt, da Variablendeklarationen ebenfalls gehoistet werden.

Mathias