2016-12-08 3 views
0

den Fehler: Menu.js: 31 Uncaught Typeerror: bubble.render keine Funktionxxx ist keine Funktion innerhalb eines für

wird es in diesem Code geschieht:

function Menu() { 
    this.bubbles = []; 
    this.bubbles.push(new MenuBubble("Etudiants",FSMEnum.ETUDIANTS)); 
    this.bubbles.push(new MenuBubble("Sujets",FSMEnum.SUJETS)); 
    this.bubbles.push(new MenuBubble("Valider",FSMEnum.VALIDATE)); 
    this.bubbles.push(new MenuBubble("Choix",FSMEnum.MATCH)); 

    this.render = function(x,y,w,h) { 
     ctx.fillStyle = '#555555'; 
     ctx.fillRect(x, y, w, h); 

     var i=0; 
     for(bubble in this.bubbles) 
     { 
      bubble.render(x+(w/2), y+((h/6)*(i+1))); // Here's the error 1 
      i++; 
     } 
    }; 

    this.getBubbles = function() { 
     return this.bubbles; 
    }; 

} 

und dieses ein:

function MenuBubble(name,state) { 

    this.name = name; 
    this.state = state; 

    this.render = function(x,y) { 

     ctx.beginPath(); 
     ctx.arc(x, y, 30, 0, 2 * Math.PI, false); 
     ctx.fillStyle = 'green'; 
     ctx.fill(); 
     ctx.lineWidth = 5; 
     ctx.strokeStyle = '#003300'; 
     ctx.stroke(); 
     ctx.closePath(); 


    }; 


    this.clicked = function() { 
     FSM.state = this.state; 
    }; 


} 

die beiden Teile des Codes sind oben in verschiedenen Dateien, die in der richtigen Reihenfolge (MenuBubble und dann Menü) enthalten sind.

Diese 2 Codes werden innerhalb einer Hauptleitung ausgeführt, was kein Problem darstellt.

Im Haupt i Code ausführen kann wie:

Menu.getBubbles().forEach(function(element) { 
     if (true) { 
      alert('clicked a bubble'); 
      this.clicked(); // Here's the error 2 
     } 
    }); 

Es läuft perfekt, aber keine Funktionen aus der Blase aus irgendwelchen Gründen fordern.

Edit: zu klären, ich meinte, dass die Warnung zeigte (wenn das angeklickt, was kommentiert wird, zeigt es 4 mal, wie ich 4 Blasen in meinem Menü instanziiert haben)

Im zweiten Fall ruft this.clicked() oder einfach angeklickt() funktioniert in keiner Weise.

Gibt es etwas, das ich mit Objektmethoden vermisse?

main.js: http://pastebin.com/BmTiDbFD

Index.HTML: http://pastebin.com/CfmYu5eJ

+0

Versuchen Sie, 'this.render()' rekursiv aufzurufen? – guest271314

+0

Innerhalb des Menüs rufe ich bei jedem Rendern das Rendern von MenuBubble neben dem Menü-Rendering auf. Es wurde unten beantwortet :) –

+0

Nein. Die rekursiven Aufrufe von 'bubble.render (x + (w/2), y + ((h/6) * (i + 1)))' erstellt eine Endlosschleife https: // jsfiddle.net/mqdnx4w6/ – guest271314

Antwort

1

Diese Zeile:

for(bubble in this.bubbles) 

zu tun, ist nicht das, was Sie denken, es ist. Für jede Schleife in JS durchlaufen Indizes, keine Elemente.

for(index in this.bubbles) { 
    var bubble = this.bubbles[index]; 
    ... 

ist, was Sie wollen

+0

Danke! Aus anderen Sprachen kommend hätte ich das in Tagen nicht erraten! Validierung in 3 Minuten! –

+1

Während Ihre Lösung korrekt ist, ist Ihre Erklärung überhaupt nicht korrekt. For/In-Schleifen sollen Objekte iterieren und die Eigenschaften dieses Objekts auflisten. Die Aufzählungsvariable gibt den Eigenschaftsnamen als Zeichenfolge zurück, und dieser Name kann an das Objekt übergeben werden, um den Wert dieser Eigenschaft zurückzugeben. for-Schleifen, die zählen, verwenden numerische Indizes und sind für die Verwendung in Arrays und array-ähnlichen Objekten gedacht. Sie listen nur die Elemente des Arrays und nicht alle Nicht-Index-Eigenschaften auf. Der richtige Weg, dies zu tun, da ein Array iteriert wird, wäre eine Accounting-Schleife zu verwenden. –

+0

Danke, ich verstehe jetzt den Kommentar, der unten gemacht wurde! Accounting-Schleife ist eine for/of? –

2

Maybe that's why

Vielleicht deshalb, bubble nur der Index.

UPDATE: Indizes sind Zahlen, i oder bubble ist nicht der Index. Weil für/in Eigenschaften aufzählt, nicht auf Indizes. So wird typeof istring, aber nicht number

+0

Danke! Ich habe die gleiche Antwort ein paar Sekunden zuvor erhalten, aber immer noch danke für die Zeit! –

+0

Nicht wahr (obwohl die Konsole es so aussehen lässt). For/in listet Eigenschaften auf, nicht Indizes. Ändern Sie Ihr Protokoll in: typeof i und Sie sehen Zeichenfolge. Indizes sind Zahlen. Verwenden Sie eine regelmäßige zählende Schleife und versuchen Sie es. Sie erhalten die Nummer. –

+0

Vielen Dank! Sie haben Recht, ich habe nicht erwartet, dass sie den Unterschied zwischen den Eigenschaften und Indizes sind. Nochmals vielen Dank! – Max

1

Für die ‚this.clicked() Szenario:

ersetzen 'this.clicked()' mit 'element.clicked()'

+0

Th anks! Ist das "Element" etwas, das gewöhnlich zurückgegeben wird? Nur durch Instinkt würde ich viele Dinge "Element" nennen, aber wenn man das sieht, kann es ziemlich leicht zu Konflikten kommen. –

+1

Sie können es benennen, was auch immer Sie mögen. Wenn eine andere Variable aus einem höheren Bereich denselben Namen hat, wird sie schattiert. (wird nicht mehr in der Lage sein, auf die übergeordnete Bereichsvariable zuzugreifen), um gängige Namen zu vermeiden. Im Allgemeinen nur nennen, was es ist, d. H. Eine Instanz von MenuBubble, 'menuBubble' – Baconbeastnz

1

Erstellen Sie eine Variable Referenz this, substituieren for..of Schleife für for..in loop

function Menu() { 
 
    this.bubbles = []; 
 
    this.bubbles.push(10); 
 
    this.bubbles.push(20); 
 
    this.bubbles.push(30); 
 
    this.bubbles.push(40); 
 
    var that = this; 
 
    this.render = function(prop) { 
 
     console.log(prop || "first call") 
 
     for(bubble of this.bubbles) 
 
     { 
 
      console.log(bubble); // Here's the error 1 
 
     } 
 
    }; 
 

 
    this.getBubbles = function() { 
 
     return this.bubbles; 
 
    }; 
 

 
} 
 

 
var g = new Menu(); 
 
g.render()

+0

Es tut mir leid, aber ich verstehe das Manöver dahinter nicht. Mir wurde gerade gesagt, dass das for..in einen Index "zurückgibt", das für die verschiedenen Objekte navigiert? Und ich verstehe nicht die Var, die = das; auch tatsächlich, hat es irgendeine Verwendung? –

+1

'for..of' loop iteriert die Elemente des Arrays selbst anstelle der Indizes des Arrays. 'Daß = this' war der Bezug auf' 'this' innen for..of' Schleife aufrechtzuerhalten, obwohl rekursiv Aufruf' that.render() ', das heißt' that.render (x + (w/2), y + ((h/6) * (i + 1))) ', innerhalb' 'for..in' oder for..of' Schleife führt zu einer Endlosschleife, aus stacksnippets weggelassen – guest271314

+0

Nein, für/in zurückkehrt keinen Index . Wie ich schon sagte, das ist es, womit eine normale Zählschleife iteriert, und das sollten Sie verwenden, wenn Sie ein einfaches Array haben. –

Verwandte Themen