javascript-Funktionen sind Objekte?
Kämpfe ich mit einer Javascript Frage für einige Zeit jetzt, und ich war nicht in der Lage, eine Erklärung zu finden, die auf das web. Ich denke, es ist weil ich nicht den richtigen keywords, die möglicherweise auch damit zusammenhängen, warum ich kämpfen bin mit diesem überhaupt.
Meine Grundannahme ist, dass es möglich ist, zu verändern, Objekte:
> var x = {'n': 2};
> x['n']
2
> x['n'] = 3;
3
pheww, arbeitete. Aber noch sind (die Funktionen sind Objekte, zu):
> var addn = function(a) {
var n = 2;
return n + a;
}
> addn(3);
5
> addn['n'] = 3;
3
> addn(3);
5
Dieser Zeit war ich nicht in der Lage zu ändern 'n'. Gibt es eine Möglichkeit dieses Problem zu beheben, während die funktionale Geschmack? Im Gegensatz zum gehen voll OO. Eine Verwandte Frage, die ich habe, wäre, wie zu pflegen Abhängigkeiten von Funktionen zum Zweck der zum Beispiel Test - wieder w/o gehen OO? Der Ursache bin ich auf der Suche nach einer Lösung, aber wenn möglich würde ich auch gerne verstehen, nach welchem Mechanismus in Javascript macht mich kämpfen.
Cheers,
Mark
Haftungsausschluss:
Durch die Erwähnung OO ich weiß nicht Vorsatz kann man nichts gegen sagen OO. Und ich habe nicht die Absicht, etwas zu sagen, gegen VI oder Emacs entweder. Wenn ich irgendwie deine Gefühle verletzt überspringen Sie bitte diese ein.
- Sie konnte immer passieren in n als parameter, aber ich nehme an, dass ist nicht, was Sie Fragen.
- Was meinst du mit "dieses mal war ich nicht in der Lage zu ändern 'n'"? Tut
addn['n']
zurück3
? - Im Hinblick auf Ihr OO Bemerkungen: Sie versuchen, neu zu erfinden OO, die schon mehr als genug getan, auch in JavaScript. 😉
- wow, danke an Euch alle! Ich bin absolut beeindruckt, innerhalb von weniger als einer Stunde haben wir die komplette Diskussion zu dem Thema. Das ist wirklich hilfreich. Genial!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich verstehe deine Frage richtig, Sie können geben Sie einen Namen für Ihr anonyme Funktion und den Zugriff auf die Funktion die Eigenschaften des Objekts durch das:
(function () { }).prototype
Private Variablen in einer Funktion Gültigkeitsbereich, und eine Eigenschaft eines Objekts sind 2 sehr verschiedene Dinge.
var n
innen, die Funktion ist völlig unzugänglich von außen, die Funktion.So nach, dass code ausgeführt wird, wird
addn.n == 3
, aber den anderen Wert eingestelltvar n
initialisiert wird jedes mal, wenn die funciton läuft. Aufgrund der Eigenheiten von javascript, eine Funktion kann nicht wirklich darauf zugreifen eigenen Eigenschaften sehr einfach. Anstatt in diesem Muster würde besser erreicht werden, indem Sie übergeben ein argumentfunction(n, a)
Oder verwenden Sie ein Objekt, etwas zu erreichen, ähnlich.
Objekt-Eigenschaften und lokale Variablen sind weitgehend unabhängigen:
var n
deklariert eine variable, diebezieht sich auf die Funktion, die es in (D. H.
es ist nicht sichtbar außerhalb des
Funktion (außer über Verschluss)).
addn['n']
fügt eine Eigenschaft namensn
zu
addn
und ist äquivalent zuaddn.n
Da JavaScript hat die Funktion, den Geltungsbereich, die Sie verwenden können, eine Funktion zum speichern der Wert von n etwa so:
Am besten ist es vollkommen zu vergessen die traditionellen OO-Konzept von "Objekten" im Javascript-land, und zu denken, statt in Bezug auf die Verschlüsse. Ich empfehle die Lektüre dieses tutorial von John Resig, der Erfinder von jQuery.
Grundsätzlich alles in Javascript ist ein Objekt. Wenn Sie sagte
Verweise auf 'a' noch zurück 3, aber einer hat auch ein Mitglied 'n', die mit dem Wert 4. Also wenn du sagst
addn['n'] = 3
Sie ein neues Mitglied hinzufügen, um addn, und beeinträchtigt die Funktion in keiner Weise.Ich dringend empfehlen zu Lesen Wie gut c-Gewohnheiten fördern können schlechte javascript-Gewohnheiten. beschreibt all die Dinge, die man falsch machen kann, es ist eine tolle Einführung in die Weg-Objekte arbeiten in Javascript.
Erste, Sie werden nicht die änderung der variable, Funktion dadurch:
Die Funktion, die Sie definiert haben keinen Namen (auch bekannt als "anonyme Funktion"). Sie sind einfach zuweisen, dass die Funktion eine variable namens
addn
. Eine variable hat keine Eigenschaft - es ist einfach ein container (es sei denn, die variable bezieht sich auf ein array). Soaddn['n']
gibt nichts zurück.Als Benutzer
casablanca
angegeben ist, können Sie Namen Ihre Funktion alsfunc
und dann zugreifen (und ändern) seine Eigenschaften wiefunc.<propertyname>
.