Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 26
  1. #1
    DonR ist offline Grünschnabel
    registriert
    24-05-2013
    Beiträge
    4

    Funktionen innerhalb von Funktionen

    Hallo zusammen, ich hätte da eine grundlegende Frage und ich komme damit in Javascript nicht zurecht. Ich bin es gewohnt Java zu programmieren, daher kommt sicher auch mein Denkfehler.

    Ich habe viel gelesen über Klassen in Javascript und hier gehen die Meinungen auseinander. Gibt es welche oder nicht. Aber ich möchte nicht lange abschweifen. Ich würde gerne eine Funktion erstellen die eine weitere Funktion enthält. Die erste soll sozusagen als Klasse fungieren und die zweite als Funktion der Klasse.

    Mein Ansatz ist also folgender:

    Code:
    function foobar(){
      	
      	alert('inside foobar');
      	
      	function a(){
      		alert('inside a');
      	}
      	
      }  
       
       var foo=new foobar();
       foo.a();
    Dies funktioniert natürlich nicht wie ich es mir vorstellen. Ändere ich die Funktion folgendermassen (google hilft ja bekanntlich)

    Code:
    function foobar(){
      	
      	alert('inside foobar');
      	
      	this.a=function(){
      		alert('inside a');
      	}
      	
      }  
       
       var foo=new foobar();
       foo.a();
    funktionert das Ganze. Nur kann ich die Folgen davon nicht abschätzen. Ist es möglich mir zu erklären, warum es mit this.a funktioniert? Ich stelle mir nämlich die Frage, warum es nicht funktioniert wenn ich this.a durch var a ersetzte. Ich denke, dass dies ja eigentlich das gleiche sein sollte.

    Code:
     function foobar(){
      	
      	alert('inside foobar');
      	
      	var a=function(){
      		alert('inside a');
      	}
      	
      }  
       
       var foo=new foobar();
       foo.a();
    Ich hoffe ich konnte das Problem einigermasen anschaulich schildern. Nochmal die Frage zusammengefasst. Wie kann ich eine Funktion innerhalb einer Funktion erstellen und diese auffrufen. Bzw. ist die Methode mit this.a=function() eine elegante. Kann es dadurch später zu Problemen kommen, bzw. gibt es bessere Alternativen um dies zu realisieren.

    Vielen Dank im voraus

  2. #2
    Kasalop ist offline Routinier
    registriert
    29-08-2012
    Beiträge
    398

    AW: Funktionen innerhalb von Funktionen

    ganz simple

    function a() {} == private
    this.a = function() {} == public



    Lg Kasalop

    EDIT: Soll heißen:
    Code:
    function foo() {
      var bar = function() {
        alert('bar');
      }
      this.baz = function() {
        alert('baz');
      }
    
      try {
        bar();  // geht
        this.baz();  // geht
      } catch(err) {}
    }
    
    new foo().bar(); // geht nicht
    new foo().baz(); // geht
    Geändert von Kasalop (24-05-2013 um 17:33 Uhr)

  3. #3
    DonR ist offline Grünschnabel
    registriert
    24-05-2013
    Beiträge
    4

    AW: Funktionen innerhalb von Funktionen

    Alles klar, vielen Dank. Ich hatte eher die Befürchtung, dass es gegenteilig ist und ich die funktion eventuell nicht von außerhalb auffrufen kann. Ich soll eine Teilfunktion schreiben und dachte ich mache das mal Oo. Leider ist der "Dialekt" von JS für mich etwas ungewohnt :-)

    Ich vermute ich werde noch so die ein oder andere Frage hier im Forum posten um die Sprachbarrieren zu überwinden.

  4. #4
    Kasalop ist offline Routinier
    registriert
    29-08-2012
    Beiträge
    398

    AW: Funktionen innerhalb von Funktionen

    gern und klar tu dir keinen zwang an. Wie in jedem Forum halt bitte vorher die SuFu nutzen, damit nicht jede frage 100 mal auftaucht^^ aber das ist ja klar. Dann viel Erfolg und bei Fragen: frag.

    eine teilfunktion? wenns mehr ist (ich kenne ja nicht die komplette aufgabe) wäre uU das templete method pattern etwas für dich. (Bin ein verfechter, dass man jedes Pattern kennen sollte, da es einem uU viel arbeit abnehmen kann Wirste aber wenn noch mehr Fragen kommen wahrscheinlich noch merken ^^)

    Lg Kasalop

  5. #5
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.751

    AW: Funktionen innerhalb von Funktionen

    Zitat Zitat von Kasalop Beitrag anzeigen
    ganz simple
    Naja - ganz so simpel ist auch nicht...

    Generell gibt es in JS keine Klassen (nein - ich will jetzt nicht wieder eine Diskussion dazu anstoßen... hatten wir ja in http://forum.jswelt.de/javascript/57...rfaces-js.html (Diskussion zu Klassen/Interfaces in JS)). Deswegen gibt es auch sowas wie private und public nicht. Es gibt nur scopes und Objekte.

    Wenn du eine Funktion innerhalb einer Funktion definierst, ist sie nur im scope der außeren Funktion definiert und kann da erst einmal auch nicht raus.

    Konstruktoren (was gerne mal als "Klasse" bezeichnet wird) sind in JS Funktionen (und jede Funktion kann als Konstruktor aufgerufen werden, auch wenn das dann oft keinen Sinn ergibt). Durch den Aufruf mit "new" wird vor dem Aufruf der Funktion ein neues Objekt erstellt, das dann der Funktion als "this" zur Verfügung steht. Dieses Objekt wird dann auch von der Funktion zurückgegeben (außer es steht ein explizites "return" mit etwas anderem in der Funktion - dann ergibt es aber keinen Sinn, diese Funktion als Konstruktor aufzurufen).

    Wenn du jetzt innerhalb des Konstruktors "this.IRGEND_WAS = ..." ausführst, weist du einfach nur der Eigenschaft IRGEND_WAS des Objektes einen Wert zu. Wenn das eine (innere) Funktion ist, kannst du diese dann auch außerhalb des Konstruktors aufrufen.

    Aber eigentlich ist die elegantere, schnellere und speicherfreundlichere Art, Methoden an eine "Klasse" zu bringen, das prototyping. Hier würde das Ganze in etwa so aussehen:
    Code:
    function Foo(){};
    
    Foo.prototype.baz = function(){
    	alert('baz');
    }
    
    new Foo().baz();
    Das funktioniert so: wenn man bei einem Objekt eine Eigenschaft abfragt (eine Methode ist in JS nichts anderes als eine Eigenschaft, die eine Funktion speichert) wird zuerst geschaut, ob bei ihm selbst die Eigenschaft registriert ist (wäre bei dem Ansatz von Kasalop der Fall).
    Ist dies nicht der Fall, wird nach gesehen, welche Funktion der Konstruktor des Objektes war. In dem Konstruktor wird dann die Eigenschaft .prototype aufgerufen und geschaut, ob die Eigenschaft dort registriert ist (wäre bei meinem Code der Fall).
    Ist dies wieder nicht der Fall, wird der Konstruktor dieses .prototype abgefragt... usw.

    Das wird so lange gemacht, bis die Eigenschaft entweder gefunden wird - dann wird sie zurückgegeben - oder man am Ende der Prototype-Kette ist - dann wird undefined zurückgegeben.

    Durch diese Prototype-Kette kann man auch sowas wie Vererbung realisieren. Aber das Konzept ist doch anders.

    PS: @Kasalop: in deinem Code fehlt ein "catch" und außerdem geht die Zeile, die du mit "// geht" markiert hast, auch nicht - es gibt in dem Scope der Funktion keine lokale Variable "baz".

  6. #6
    Kasalop ist offline Routinier
    registriert
    29-08-2012
    Beiträge
    398

    AW: Funktionen innerhalb von Funktionen

    Zitat Zitat von kkapsner Beitrag anzeigen
    (außer es steht ein explizites "return" mit etwas anderem in der Funktion - dann ergibt es aber keinen Sinn, diese Funktion als Konstruktor aufzurufen).
    nicht? würde schon sagen, dass es durchaus Fälle gibt in denen man damit ein wünschenswertes Verhalten hervorrufen kann (nicht unbedingt wirklich sauberes OOP, aber... hey wir sind in js ^^). Durch Verwendung von return kann ich ein Objekt zurückgeben, welches aus dem scope der "constructor"-Funktion kommt und somit Zugriff auf die inneren Variablen etc hat, aber seine eigene Zugriffsart bietet. Dummes beispiel, aber egal, mir fällt grad kein gutes ein ^^:
    Code:
    function Foo() {
      var _idx = 0;
      return {
        getIndex:function() {
          return _idx;
        },
        setIndex:function(newIndex) {
          _idx = newIndex;
        }
      };
    }
    ging das nicht? Hatte ich mal vor ewigkeiten in einem oop tutorial zu js gesehen, habs nie gebraucht, daher leider auch nicht mehr ganz auf dem schirm, für was sie das wirklich verwendet haben. (Bevor was in die richtung kommt: mir ist klar, dass man das auch ohne das return hinbekommen würde! Ich sag ja, dass es kein gutes Beispiel ist.) Man könnte es uU für sowas verwenden wo man eine funktionialität einbringen möchte, die eigentlich nicht zu klasse gehört, also ein
    Code:
    function List(fulllistAsElementArray) {
      var _listElements = fulllistAsElementArray;
      this.add=function(el) { _listElements.push(el); }
      return {
        obj:this,
        iterator:function() {
          return {
            internalCounter:0,
            copyOfClassElements:_listElements,
            return {
              hasNext:function() {
                return (internalCounter < copyOfClassElements.length);
              }
              next:function() {
                return copyOfClassElements[internalCounter++];
              }
            }
          }
        }
      }
    }
    *Ungetestet* Zugriff wäre dann per name.obj um elemente hinzuzufügen, etc und per name.iterator() würde man einen interator für die liste zurück bekommen. naja nur ne spinnerei. Nicht perfekt. aber besser als das erste beispiel denke ich ^^

    Zitat Zitat von kkapsner Beitrag anzeigen
    PS: @Kasalop: in deinem Code fehlt ein "catch" und außerdem geht die Zeile, die du mit "// geht" markiert hast, auch nicht - es gibt in dem Scope der Funktion keine lokale Variable "baz".
    jop danke. ist ergänzt.

    Lg Kasalop
    Geändert von Kasalop (24-05-2013 um 17:54 Uhr) Grund: return eingefügt

  7. #7
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Funktionen innerhalb von Funktionen

    Zitat Zitat von Kasalop Beitrag anzeigen
    Durch Verwendung von return kann ich ein Objekt zurückgeben, welches aus dem scope der "constructor"-Funktion kommt und somit Zugriff auf die inneren Variablen etc hat,
    dann kann ich aber auch gleich den konstruktor als funktion aufrufen

    Zitat Zitat von Kasalop Beitrag anzeigen
    aber seine eigene Zugriffsart bietet.
    verstehe ich nicht

    Zitat Zitat von Kasalop Beitrag anzeigen
    Code:
    function Foo() {
    
      var _idx = 0;
      return {
        getIndex:function() {
          return _idx;
        },
        setIndex:function(newIndex) {
          _idx = newIndex;
        }
      };
    }
    und wo ist hier der mehrwert von var x = new Foo() zu var x = Foo()

    Zitat Zitat von Kasalop Beitrag anzeigen
    ging das nicht?
    doch, macht aber keinen sinn

  8. #8
    Kasalop ist offline Routinier
    registriert
    29-08-2012
    Beiträge
    398

    AW: Funktionen innerhalb von Funktionen

    also iwie wirkst du auf mich als wolltest du einfach nur trollen. Ich hab zwar keine Ahnung wieso, aber wird sich hoffentlich irgendwann wieder einstellen.
    Zitat Zitat von hesst Beitrag anzeigen
    dann kann ich aber auch gleich den konstruktor als funktion aufrufen
    [...] und wo ist hier der mehrwert von var x = new Foo() zu var x = Foo()
    Dann nimm halt das zweite Beispiel in dem auch this verwendet wird. das wird wohl eher nichts, wenn du es funktional aufrufst, oder irre ich? this sollte doch im funktionskontext auf window zeigen und nicht auf das Objekt. Wieso nimmst du also nicht das Beispiel, statt dem Beispiel zu dem ich sogar extra zweimal schreibe, dass es kein gutes Beispiel ist, sondern nur die funktionsweise von return zeigen soll?! Du pickst dir (auch im anderen Thread) immer die Punkte raus, mit denen du nörgeln kannst und ignorierst dann auch noch kram was ich dazu schreibe oder anmerke oder behauptest einfach irgendwas. ich versteh den Sinn nicht?!

  9. #9
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Funktionen innerhalb von Funktionen

    Zitat Zitat von Kasalop Beitrag anzeigen
    Dann nimm halt das zweite Beispiel in dem auch this verwendet wird.
    das macht doch auch keinen sinn?! du hast dein this untergebracht, schön, aber deine add funktion kanns du auch am zurückgegebenen objekt unterbringen.

    Zitat Zitat von Kasalop Beitrag anzeigen
    Wieso nimmst du also nicht das Beispiel, statt dem Beispiel zu dem ich sogar extra zweimal schreibe, dass es kein gutes Beispiel ist
    das sind beides keine guten beispiele.

    Zitat Zitat von Kasalop Beitrag anzeigen
    Du pickst dir (auch im anderen Thread) immer die Punkte raus, mit denen du nörgeln kannst
    ich picke mir punkte raus die ich so nicht stehen lassen will, weil ich denke sie sind falsch/schlecht.

    Zitat Zitat von Kasalop Beitrag anzeigen
    und ignorierst dann auch noch kram was ich dazu schreibe oder anmerke
    ich ignoriere dein krampfhaftes festhalten an deinen einmal getroffenen aussagen mit irgendwelchen beschimpfungen.
    oder was meinst du genau, worauf sollte ich deiner meinung nach eingehen?

    Zitat Zitat von Kasalop Beitrag anzeigen
    oder behauptest einfach irgendwas.
    wo? was? wenn du willst dass ich irgendwo drauf eingehe frage ruhig nochmal.

    Zitat Zitat von Kasalop Beitrag anzeigen
    ich versteh den Sinn nicht?!
    den sinn wovon? meinen kommentaren? ich will nur nicht irgendetwas unkommentiert stehen lassen, was meiner meinung nach falsch war.
    gester die aussage von dir, daß eine globale variable besser ist als 2 mal einen property zu lesen von dir und die von kkapsner, daß man in js abstrakte methoden definieren kann(jedenfalls habe ich sie erst mal so verstanden).
    dann heute die von dir, dass es sinnvoll sein kann in einem construktor ein anderes objekt als this zurückzuliefern.

  10. #10
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.751

    AW: Funktionen innerhalb von Funktionen

    Edit: Mist - falscher Thread...

    Gut - hab' aber auch hier was zu sagen:

    @Kasalop: ich sehe schon, dass das zweite Beispiel das erzeugte Objekt verwendet (wir also eine "Anwendung" für die Technik haben). Aber so richtig sinnvoll erscheint mir auch dieses Beispiel nicht zu sein. Wenn ich den Konstruktor Foo() aufrufe, erwarte ich doch, dass ich danach ein Objekt haben, bei dem "instanceof Foo" auch wirklich wahr ergibt.
    Da fällt mir aber doch tatsächlich eine sinnvolle Anwendung für das return ein: Singletons
    Code:
    (function(){
    	var instance;
    	function Singleton(){
    		if (instance){
    			return instance;
    		}
    		else {
    			instance = this;
    		}
    	}
    	window.Singleton = Singleton;
    })();
    
    var s1 = new Singleton();
    var s2 = new Singleton();
    alert(s1 === s2);
    - finde ich jetzt sogar recht elegant und sicher. In anderen Sprachen wird ja normalerweise der Konstruktor privat gemacht und dann über einen Getter die Instanz publiziert. Geht in JS nicht so ohne weiteres (wenn man z.B. instanceof trotzdem verwenden möchte) und mit diesem Konstrukt ist garantiert, dass es nur eine Instanz gibt.

    Nehme meine Aussage, dass das nie Sinn ergibt, zurück und sage, dass das in den meisten Fällen, wo ich da gesehen habe, keinen Sinn ergab.
    Geändert von kkapsner (25-05-2013 um 01:03 Uhr)

  11. #11
    Kasalop ist offline Routinier
    registriert
    29-08-2012
    Beiträge
    398

    AW: Funktionen innerhalb von Funktionen

    Hallo hesst,

    okay evtl hab ich mich auch etwas reingepackt. Also nochmal ganz ruhig was ich meine, hoffe wir bekommen das hin^^

    Zitat Zitat von hesst Beitrag anzeigen
    ich picke mir punkte raus die ich so nicht stehen lassen will, weil ich denke sie sind falsch/schlecht.
    Das ist gut. Würdest du allerdings auch kurz was zu den anderen Punkten schreiben und wenn es ein >>*zustimm*<< ist oder so, dann hätte ich nicht das Gefühl, dass du aus einem langen Beitrag die beiden Punkte rauspickst über die man streiten kann (mal übetrieben gesagt).

    Zitat Zitat von hesst Beitrag anzeigen
    ich ignoriere dein krampfhaftes festhalten an deinen einmal getroffenen aussagen mit irgendwelchen beschimpfungen.
    oder was meinst du genau, worauf sollte ich deiner meinung nach eingehen?
    Beschimpfungen? okay tut mir leid wenn das so rüberkam. Sollte es nicht. Hab das eigentlich nicht nötig und sehe das auch recht gelassen. nicht sauer, eher mit unverständnis.

    Zitat Zitat von hesst Beitrag anzeigen
    wo? was? wenn du willst dass ich irgendwo drauf eingehe frage ruhig nochmal.
    okay werde ich tun. Ich ging davon aus, dass wenn du auf etwas nicht eingehst, dies mit Absicht machst und ein Nachfragen, dann auch nichts mehr bringt. Aber werde ich ab jetzt tun
    bzgl "wo? was?" du schriebst gestern das ich gesagt hätte, dass man mit abstrakten Methoden keine Interfaces darstellen könnte. Das war aber nie meine Aussage. Ich sagte nur, dass Interfaces etwas anderes als abstracte klassen sind. Abstrakte Klassen können viel mehr als Interfaces, in Beispielsweise Java oder php. Interfaces definieren für mich Schnittstellen, also methoden und properties, die ich von außen nutzen kann. Eine abstrakte klasse kann aber auch schon implementierungen und private / protected properties und methoden enthalten, welche für eine Schnittstelle nicht relevant, sondern sogar falsch sind. Habe ich also Interface mit dem name "IWriter" kann ich mir sicher sein, dass dies alle benötigten Methoden beschreibt, aber nicht implementiert. Habe ich eine abstrakte Klasse mit dem Namen "BasicWriter", so kann hier schon viel mehr drinstecken, beispielsweise könnte schon eine format-methode oder der Zugriff auf das Filesystem voll implementiert sein, was ich eigentlich gar nicht haben will, weil ich eine Datenbank nutzen möchte (nur als Beispiel). Da ist es definitionssache: Enthält IWriter wirklich nur eine Schnittstellenbeschreibung oder ist da mehr "reingepantscht" was ich nicht haben will. Daher ist eine abtrakte Klasse viel mehr als ein Interface nach meiner Ansicht.

    Genau aus diesem Grund ist es in den meisten Sprachen ja genauso, dass Mehrfachvererbung nicht möglich ist, sondern nur mehrere Interfaces geerbt werden können.

    Zitat Zitat von hesst Beitrag anzeigen
    den sinn wovon? meinen kommentaren? ich will nur nicht irgendetwas unkommentiert stehen lassen, was meiner meinung nach falsch war.
    Gut so ^^

    Zitat Zitat von hesst Beitrag anzeigen
    gester die aussage von dir, daß eine globale variable besser ist als 2 mal einen property zu lesen von dir
    und das ist ein Punkt den ich genau mit der Aussage meinte ^^

    aaaalso löse ich mal auf, wieso ich da genervt reagiert habe:

    zuerst lese man mal meinen Originalpost
    1: http://forum.jswelt.de/javascript/57...tml#post368238 (Automatisch langesam scrollen nach 3 Sekunden - dann Sekunden Pause und oben wieder)
    Nun könnte man das noch dahin optimieren, dass wir keine globalen Parameter mehr haben. Entweder eine klasse schreiben, oder eben in nen wrapper packen.
    Da schreib ich es ja selbst schon. Es war ein Beispielcode und keine fertige Lösung. Ich schreibe in Foren immer codes, die den TE inspirieren sollen selbst was zu tun. es war ein Konzept und kein Code, den er 1-zu-1 kopieren soll und nutzen. Das ist meiner Meinung nicht sinn eines Forums.

    als nächstes weiter im Gespräch:
    2: http://forum.jswelt.de/javascript/57...tml#post368248 (Automatisch langesam scrollen nach 3 Sekunden - dann Sekunden Pause und oben wieder)
    Doppelte auslesen einer Eigenschaft? Kein sehr schöner Stil. Ne Klasse wäre die bessere Option an der Stelle, wollte ich dem TE aber nicht zumuten.
    Hier her stammt die Aussage von mir, dass ich doppeltes Auslesen nicht schön finde, die zweite Aussage, dass ich das lediglich als vereinfacht für den TE schrieb, wird ignoriert (aber mit dem global kann man ja trotzdem noch auf meinen geposten Quellcode beziehen, also kein Problem, nur das man mir das vorwirft, obwohl im Originalpost von mir selbst schon steht, dass man das verbessern sollte (als aufgabe für den TE) verstehe ich nicht ganz, aber okay, es geht ja noch weiter...)

    nun kkapsners Antwort (und berechtigter Einwand) bzgl doppeltes auslesen vs speichern
    3: http://forum.jswelt.de/javascript/57...tml#post368252 (Automatisch langesam scrollen nach 3 Sekunden - dann Sekunden Pause und oben wieder)
    außerdem kann ich dann sicher sein, dass ich mit den richtigen Werten arbeite. In einem anderen Fall (also wenn der Benutzer auch ein Eingabegerät für den Rechner hat) könnte ja noch irgendwie anders gescrollt werden und dann wäre es nicht mehr sicher, dass der Wert, den du in der "Klasse" (NB: es gibt in JS keine Klassen) gespeichert hast, auch korrekt ist.
    Worauf wir das mit folgendem Gespräch eigentlich beendet hatten:
    4: Ich in #14: Hinweis auf Anforderungsanalyse (der TE hat nunmal gesagt, dass es keine Möglichkeit zu scrollen gibt) und:
    Könnte man auch lösen durch nutzen von onscroll.
    [...]
    okay einigen wir uns auf Ansichtssache. Ist es eh in den meisten Fällen in der Informatik. Für mich gehört sowas in ein Model und das Model wird nicht mit der View vermischt, insofern es geht. Daher würde ich einen alten Wert den ich bereits schonmal ausgelesen habe ins Modell speichern und nicht nochmal auslesen.
    Andererseits hab ich das oben natürlich auch nicht ganz sauber umgesetzt allerdings hauptsächlich ums für den TE einfach zu halten.
    kkapsner zu onscroll:
    - stimmt. Aber weiteres unten.
    [...]
    Die Scrollposition ist bei mir definitiv Teil des Views... aber, wie gesagt, Ansichtssache. Für so ein "einfaches" Problem würde ich ja sowieso nicht so strikt trennen...
    sooo und an dieser Stelle war es für uns beide (für mich kann ich sagen ja, bei kkapsner gehe ich durch schweigen davon aus) geklärt und wir sind schon bei einem neuen Thema. Eine Diskussion das globale Variablen doppeltem Auslesen vorzuziehen seien oder gar das globale Variablen gut sind hat nie wirklich existiert wie du hoffentlich an den zitierten Passagen erkennst. Jetzt sind wir inzwischen bei Interfaces und dann kommt dein Kommentar
    auf jeden fall besser als eine globale variable. außerdem hat kkapsner schon recht [...] das hat nichts mehr mit stil zu tun, das ist konsistenzsicherung.
    Soll heißen dein erster Punkt hat niemand in Frage gestellt, denn darum ging es nie, sondern um die beiden Meinungen, obs in die View oder in das Model gehört und das zweite war oben schon mit onscroll beantwortet, wodurch nun in beiden Varianten die konsistenz gewährleistet ist (solange niemand js ausmacht, wo anders hinscrollt und dann wieder js aktiviert, dann wäre kkapsner sofort aktuell und mein System nach dem ersten Aufruf von setTimeout aktuell, da das Model eben erst ein update braucht^^ Das nimmt sich jetzt nicht sooo viel wie ich finde (aber darum gings ja hier gerade nicht, sry abgeschweift). Dazu schreib kkapsner ja schon: "stimmt".

    Daher fand ich deinen kommentar relativ sinnlos, weshalb dann auch die Antwort kam:
    @hesst ne Lösung dafür schrieb ich oben und kkapsner stimmte mir zu, dass dies auch geht. zu globaler variable schrieb ich auch schon was. evtl mehr als nur einen post lesen?!
    Ich hatte das Gefühl du hast die Unterhaltung nicht (oder nicht zu ende) gelesen:
    -> "Lösung" bezog sich auf konsistenz
    -> "globale Variable schrieb ich auch schon was" bezog sich auf oben zitierte passagen
    -> hinweis "evtl. mehr als nur einen post lesen?" auf mein Gefühl, dass du nicht wirklich die Unterhaltung gelesen hast, aber deinen Senf dazugibst.

    Von dir kam daraufhin:
    hab ich, trotzdem ist doppelt auslesen besser als eine globale variable
    und mein Gedanke: Du stellst etwas klar, worüber wir uns alle (kkapsner und ich ^^) einig sind und was offensichtlich ist. Wieso? Was soll das? Das war für mich ein Fall von entweder kann er / will er nicht lesen / verstehen oder er schreibt wirklich offensichtliche und nie in Frage gestellte Dinge in ein Forum. Darüber kann ich nur den Kopf schütteln. (Gestriege Ansichten Gedanken. Jetzt nicht böse gemeint, ich schreibe nur auf, wie meine Gedanken waren und wieso ich daher uU etw. angepisst rüberkam^^)

    Die Diskussion über die Interfaces verlief in Teilen ähnlich, was nicht zu meiner Stimmung beigetragen hat. Ich diskutiere gerne auch mal über ein Thema, aber auf nem Niveau bei dem ich das Gefühl habe, dass man auch überhaupt darüber reden kann.

    Ein Satz wie:
    eine abstrakte klasse welche ein interface beschreibt zeigt genau das nicht.
    führt nicht dazu, da ich mir denke: "ahaaaa und nun? abstrakte Klassen können Interfaces darstellen, bieten aber leider nicht die Eindeutigkeit, dass ich mich darauf verlassen kann, dass ich ein Interface bekomme. Man nimmt etwas, was nicht unbedingt dafür gedacht ist (evtl auch) und macht daraus etwas wofür es extra Interfaces gibt. Wieso will man soetwas tun?" Daher auch meine Aussage
    Ich kann auch den Datentyp DateTime dazu nutzen eine Zahl zu speichern... aber machen tu ich es deshalb noch lange nicht
    Weil klar. wieso nutzen wir ab jetzt nicht einfach den Datentyp DateTime (in php oder .net sprachen beispielsweise existent) um Zahlen abzuspeichern? Wofür brauchen wir da noch den Typ integer? DateTime kann viel mehr. Kann nämlich sogar außer normalen Zahlen auch noch Datum und Uhrzeiten speichern und mit denen Rechnen.

    Zudem sind (schrieb ich glaub auch irgendwo, oder verwies auf google) Interfaces viel performanter, speichereffizienter, etc als abstrakte Klassen. Daher verstand ich nicht was du uns mitteilen willst.

    und dann die rhetorische Rückfrage bzgl meiner Aussage, dass ich nie abgestritten habe, dass man mit abstrakten Klassen auch Interfaces darstellen könnte?! Ich hab es nie abgestritten in den Posts vorher, nur versucht deutlich zu machen, wieso ich das nicht sinnvoll finde. Daher weiß ich nicht wie du darauf kamst und wieder mein Unverständnis da ^^

    Dann dein Kommentar:
    lol, eine alert-interface-beschreibung. alert("diese methode bekommt einen parameter id als ganze zahl und liefert das element zu dieser id als Element-Interface im returnwert zurück")
    Da frag ich mich dann:
    abstracte Klassen sind keine Interfaces, aber können Interfaces darstellen, wenn man entsprechende Einschränkungen / Vereinbarungen bei der deinfition der abstrakten Klasse trifft.
    Wieso können wir dann nicht "vereinbaren", dass eine Klasse die nur aus methoden und eigenschaften besteht, die eine Definition von sich selbst per text zurückgeben als Abstrakt anzusehen sind?! (Das war übrigens nicht wirklich erst gemeint, das sollte man "xD" und *lach* eigentlich ausdrücken. Ob du das als ernste idee von mir oder ebenfalls als Scherz aufgefasst hast, weiß ich nicht. Ist aus deinem Kommentar nicht zu entscheiden ob du mit dem "lol" MIT mir oder ÜBER mich lachst )

    dann heute die von dir, dass es sinnvoll sein kann in einem construktor ein anderes objekt als this zurückzuliefern.
    da hat kkapsner nun ja schon ein beispiel gefunden^^ Mir fiel eben nur kein gutes ein, was ich auch mehrfach schrieb

    Sooo das ist länger geworden als beabsichtigt, aber ich hoffe es schafft etwas klarheit.

    Schöne Nacht noch, oder dann schönen Samstag

    Lg Kasalop

  12. #12
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Funktionen innerhalb von Funktionen

    also ich werde nie auf jeden satz eines postings eingehen, das mach keiner. jeder pickt sich was raus wozu er was sagen will/kann.

    Zitat Zitat von Kasalop Beitrag anzeigen
    Das war aber nie meine Aussage. Ich sagte nur, dass Interfaces etwas anderes als abstracte klassen sind. Abstrakte Klassen können viel mehr als Interfaces
    Aber was soll die aussage? das ist so als wenn ich sage "äpfel sind obst" und du antwortest mit "aber obst ist viel mehr als äpfel, birnen kann man z.b. in alkohol einlegen.

    Zitat Zitat von Kasalop Beitrag anzeigen
    Da schreib ich es ja selbst schon. Es war ein Beispielcode und keine fertige Lösung. Ich schreibe in Foren immer codes, die den TE inspirieren sollen selbst was zu tun. es war ein Konzept und kein Code, den er 1-zu-1 kopieren soll und nutzen. Das ist meiner Meinung nicht sinn eines Forums.
    ja, richtig.

    Nun könnte man das noch dahin optimieren, dass wir keine globalen Parameter mehr haben. Entweder eine klasse schreiben, oder eben in nen wrapper packen.
    das habe ich tatsächlich überlesen. aber das würde ich auch als selbstverständlichkeit betrachten.

    jetzt hat kkapsners eingeworfen, dass man die globale variable recht einfach durch lesen vor und nach der aktion vermeiden kann. und weiterhin darau hingewiesen, dass du inkonsistente daten in deinem Modell speicherst, weil sich diese zwischen 2 aufrufen der funktion ändern können.
    beides finde ich berechtigt. immer noch!

    Zitat Zitat von Kasalop Beitrag anzeigen
    und das zweite war oben schon mit onscroll beantwortet, wodurch nun in beiden Varianten die konsistenz gewährleistet ist
    also ich finde kkapsners lösung immer noch besser als mich auf diese (unsinnige) bedingung zu verlassen

    Zitat Zitat von Kasalop Beitrag anzeigen
    Von dir kam daraufhin:
    hab ich, trotzdem ist doppelt auslesen besser als eine globale variable
    ja, und der meinug bin ich immer noch. kkapsners lösung beseitigt die globale variable ohne wirklichen mehraufwand.

    Zitat Zitat von Kasalop Beitrag anzeigen
    macht daraus etwas wofür es extra Interfaces gibt.
    es gibt aber in js keine Interfaces und keine abstrakte methoden. und wenn es abstrakte methoden geben würde hättest du automatisch auch interfaces. hat man in js aber leider nicht.

    das zu den alten beiträgen, jetzt zu dem was mir hie aufgefallen ist.

    Zitat Zitat von Kasalop Beitrag anzeigen
    Zudem ... sind Interfaces viel performanter, speichereffizienter, etc als abstrakte Klassen.
    Diese (pauschal)aussage ist falsch. warum soll das so sein?

    Zitat Zitat von Kasalop Beitrag anzeigen
    Ich hab es nie abgestritten in den Posts vorher, nur versucht deutlich zu machen, wieso ich das nicht sinnvoll finde. Daher weiß ich nicht wie du darauf kamst und wieder mein Unverständnis da ^^
    wieso soll das nicht sinnvoll sein? wenn es kein schlüsselwort interface in einer sprache gibt, sondern nur abstrakte klassen, ist das sehr wohl sinnvoll.

    Zitat Zitat von Kasalop Beitrag anzeigen
    Wieso können wir dann nicht "vereinbaren", dass eine Klasse die nur aus methoden und eigenschaften besteht, die eine Definition von sich selbst per text zurückgeben als Abstrakt anzusehen sind?!
    weil du in js einfach keine schnittstelle beschreiben kannst. js ist nicht typisiert.

  13. #13
    Kasalop ist offline Routinier
    registriert
    29-08-2012
    Beiträge
    398

    AW: Funktionen innerhalb von Funktionen

    hm super. zusammenspiel von browser und forum hat gerade meinen gesamten beitrag gelöscht, den ich grad mit viel mühe geschrieben hatte >.< mal sehen ob ich später nochmal lust hab, dass alles neu zuschreiben. Da steht doch immer unten recht "Automatisch gespeichert" bekommt man das irgendwie wieder hergestellt?

    Lg Kasalop

  14. #14
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Funktionen innerhalb von Funktionen

    Da ist man mal 'ne Woche weg und verpaßt solch herrliche Dispute

    Aber ich hab noch was zur ursprünglichen Frage

    Zitat Zitat von DonR Beitrag anzeigen
    Ich habe viel gelesen über Klassen in Javascript und hier gehen die Meinungen auseinander. Gibt es welche oder nicht. Aber ich möchte nicht lange abschweifen. Ich würde gerne eine Funktion erstellen die eine weitere Funktion enthält. Die erste soll sozusagen als Klasse fungieren und die zweite als Funktion der Klasse.
    Es gibt keine Klassen! Es gibt nur Objekte. JS ist eine klassenlose Objektorientierte Sprache. Eine Funktion kann eine Konstruktorfunktion sein die, wenn du sie mit new aufrufst, eine neue Instanz eines Funktionsobjekt als lokales Objekt übergeben bekommt.


    Zitat Zitat von DonR Beitrag anzeigen
    Mein Ansatz ist also folgender:

    Code:
    function foobar(){
      	
      	alert('inside foobar');
      	
      	function a(){
      		alert('inside a');
      	}
      	
      }  
       
       var foo=new foobar();
       foo.a();
    Dies funktioniert natürlich nicht wie ich es mir vorstellen. Ändere ich die Funktion folgendermassen (google hilft ja bekanntlich)

    Code:
    function foobar(){
      	
      	alert('inside foobar');
      	
      	this.a=function(){
      		alert('inside a');
      	}
      	
      }  
       
       var foo=new foobar();
       foo.a();
    funktionert das Ganze. Nur kann ich die Folgen davon nicht abschätzen. Ist es möglich mir zu erklären, warum es mit this.a funktioniert? Ich stelle mir nämlich die Frage, warum es nicht funktioniert wenn ich this.a durch var a ersetzte. Ich denke, dass dies ja eigentlich das gleiche sein sollte.
    Nein, die Variante mit var ist fast Identisch mit der ersten. Du erzeugst eine lokale Funktion, die nur innerhalb von foobar existiert.

    Das ist das, was auch im Thread schon gesagt wurde. Es gibt unterschiedliche Scopes (Gültigkeitsbereiche), aber keine Klassen. Das heißt du kannst keine Funktion an eine Funktion binden, sondern nur an Objekte.

    Das erste a(), ist nur eine lokale Funktion, die keinen Bezug zur Instanz hat. Sie ist ausschließlich innerhalb von foobar() aufrufbar. this ist dort nicht das gleiche this, wie in foobar():
    Code:
    function foobar() {
    	function a() {
    		return this;
    	}
    	this.x = function() {
    		return a();
    	};
    }
    var a = new foobar();
    alert(a.x());// [Objekt window]
    Daher muss man an dieser Stelle mit Tricks arbeiten, entweder man ruft a() mit call() im Kontext von this auf oder man legt eine Kopie von this an (was üblicher ist)

    Du hast darüber hinaus eine wichtige Variante vergessen. Die prototypische.
    Code:
    function foobar(){
      	alert('inside foobar');
      }  
      foobar.prototype.a=function(){
      		alert('inside a');
      	}
       var foo=new foobar();
       foo.a();
    Diese Variante ist, wenn immer möglich, auch vorzuziehen. Damit bindest du die Funktion an jede Instanz von foobar und an Instanzen von Objekten, die von foobar.prototype abgeleitet sind - in anderen Sprachen nennt man das Vererbung.
    Der Vorteil ist in erster Linie die Geschwindigkeit. Diese Funktion wird im gegensatz zu deiner funktionierenden Variante, nicht bei jedem Aufruf von new() neu erzeugt, sondern nur ein einziges Mal.

    EDIT: jaja, ich seh's - das wurde ja schon alles gesagt. Tut mir leid ich hatte nicht alles gelesen
    Geändert von ein schlauer (26-05-2013 um 10:07 Uhr)

  15. #15
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Funktionen innerhalb von Funktionen

    Zu den anderen Ausführungen.

    Was mich wundert, dass ihr eine solche Diskussion anfangt. Zumal Kasalop doch am Anfang von der Kenntnis von Mustern erzählt und dann hier zwei vermischt.
    Zitat Zitat von Kasalop Beitrag anzeigen
    Man könnte es uU für sowas verwenden wo man eine funktionialität einbringen möchte, die eigentlich nicht zu klasse gehört, also ein
    Code:
    function List(fulllistAsElementArray) {
      var _listElements = fulllistAsElementArray;
      this.add=function(el) { _listElements.push(el); }
      return {
        obj:this,
        iterator:function() {
          return {
            internalCounter:0,
            copyOfClassElements:_listElements,
            return {
              hasNext:function() {
                return (internalCounter < copyOfClassElements.length);
              }
              next:function() {
                return copyOfClassElements[internalCounter++];
              }
            }
          }
        }
      }
    }
    *Ungetestet* Zugriff wäre dann per name.obj um elemente hinzuzufügen, etc und per name.iterator() würde man einen interator für die liste zurück bekommen. naja nur ne spinnerei. Nicht perfekt. aber besser als das erste beispiel denke ich ^^
    Nein, nicht unbedingt, da es auch nicht deine Behauptung untermauert.

    Es ging ja um eine Konstruktorfunktion, die mit new aufgerufen eine Instanz eines Funktionsobjekt erzeugt und du zeigst eine Factory (https://de.wikipedia.org/wiki/Fabrikmethode) die ein Objekt erzeugt und zurück gibt.

    Also zwei unterschiedliche Muster, die beide ihren Sinn machen - auch in JS. Aber die Fabrikmethode wird man nicht mit new aufrufen und genau darum ging es ja ursprünglich.

    Auch dieses Beispiel von dir, verwendet nicht die mit new erzeugte Instanz. this ist in dem Rückgabeobjekt auch nicht das window Objekt, wenn die Funktion ohne new aufgerufen wird. Es ist das neu erzeugte Objekt.

    Dazu muss man lediglich Wissen, dass die literale Schreibweise mehr oder weniger gleichbedeutend mit new Objekt() ist, d.h. wenn du return {} schreibst, dann erzeugst du ein neues Objekt.

    Das Listobjekt würde so etwas mehr Sinn machen:
    Code:
    function List(fulllistAsElementArray) {
      this.add = function(el) { fulllistAsElementArray.push(el); };
      this.iterator = function() {
    	var internalCounter =0;
    	return {
    	  hasNext:function() {
    		return (internalCounter < fulllistAsElementArray.length);
    	  },
    	  next:function() {
    		return fulllistAsElementArray[internalCounter++];
    	  }
    	};
      };
    }
    
    var l = new List([]);
    l.add(1);
    l.add(2);
    var i = l.iterator();
    
    while(i.hasNext()) { alert(i.next()); }
    Ich würde also sagen, du musst dich auch noch ein wenig mit Mustern auseinandersetzen

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. PHP is_* funktionen
    Von Benoit im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 27-08-2007, 20:41
  2. Funktionen
    Von wico im Forum JavaScript
    Antworten: 3
    Letzter Beitrag: 17-08-2007, 08:25
  3. Antworten: 8
    Letzter Beitrag: 06-06-2007, 09:09
  4. Variablen in Funktionen
    Von ArmyMan im Forum Serverseitige Programmierung
    Antworten: 5
    Letzter Beitrag: 10-01-2005, 17:20
  5. Variablen in Funktionen
    Von ArmyMan im Forum Allgemeines
    Antworten: 5
    Letzter Beitrag: 10-01-2005, 17:20

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •