2016-04-27 2 views
0

ich eine Funktion geschrieben haben, alsTypeerror: Kenntnisse ist keine Funktion - aber es ist

function proficiency(level) { 
    if (level >= 1 && level < 5) { 
    proficiency = 2; 
    } else if (level >= 5 && level < 9) { 
    proficiency = 3; 
    } else if (level >= 9 && level < 13){ 
    proficiency = 4; 
    } else if (level >= 13 && level < 17) { 
    proficiency = 5; 
    } else if (level >= 17 && level <= 20) { 
    proficiency = 6; 
    } 

    return proficiency; 
} 

Dann folgt ich es innerhalb einer anderen Funktion ausführen genannte „Roll the Dice“, wie es ein D & D Character Generator ist und dies würde würfeln reflektieren:

proficiency(level); 

Das erste Mal, dass ich es tun, es funktioniert gut. Keine Fehler. Die Funktion passiert entsprechend. Das zweite Mal versuche ich es, es gibt mir den folgenden Fehler.

TypeError: proficiency is not a function 

Dies passiert jedes Mal, wenn ich die Seite aktualisiere. Ich erkläre die Funktion global, also weiß ich nicht, wie das weitergeht.

+1

Verwenden Sie nicht den Funktionsnamen als Variablenname – j08691

Antwort

0

Möglicherweise steht Ihr Funktionsname proficiency in Konflikt mit Ihrem Variablennamen proficiency. Sie könnten den Wert sofort zurückgeben, um die Einführung einer anderen Variablen zu vermeiden.

function proficiency(level) { 
    if (level >= 1 && level < 5) { 
     return 2; 
    } else if (level >= 5 && level < 9) { 
     return 3; 
    } else if (level >= 9 && level < 13){ 
     return 4; 
    } else if (level >= 13 && level < 17) { 
     return 5; 
    } else if (level >= 17 && level <= 20) { 
     return 6; 
    } 

    throw new Error('Invalid character level'); 
} 
1

Sie überschreiben Ihre Proficiency-Funktion mit der Proferenz INSIDE der Funktion. Wenn Sie also das erste Mal proficiency(level) aufrufen, wird es als eine Funktion angesehen, aber beim zweiten Aufruf wird es mit einem Wert von 2 bis 6 überschrieben. Da proficiency(level) für Ganzzahlen ungültig ist, wird der Fehler

1

ausgegeben Problem, auf das Sie stoßen, ist eine der Schließungen. Sie verwenden die Variable proficiency zweimal.

Wenn der Code zum ersten Mal geparst wird, wird die function proficiency() an den Anfang der Datei geholt, und die Variable proficiency ist diese Funktion.

Dann, sobald Sie die Funktion das erste Mal aufrufen, überschreiben Sie es.

function proficiency() { 
    proficiency = 2; // Here, no matter which if you're inside. 
} 

Weil Sie nicht erklären proficiency an der Spitze Ihrer Funktion mit dem var Schlüsselwort, wird es dann am äußeren Umfang erklärt, höchstwahrscheinlich window. Wenn Sie also Ihre Funktion das nächste Mal aufrufen, ist proficiency nicht länger die Funktion, für die Sie sie deklarieren, sondern der Wert, seit dem die Funktion das erste Mal ausgeführt wurde.

Wie in den Kommentaren schnell gesagt wurde, als ich diese Antwort schrieb, ist der einfachste Weg, dies zu vermeiden, die Variable innerhalb der Funktion nicht den gleichen Namen wie die Funktion zu haben. Es macht auch Ihren Code einfacher zu lesen.

function proficiency(level) { 
    var result; 

    if (level >= 1 && level < 5) { 
     result = 2; 
    } else if (level >= 5 && level < 9) { 
     result= 3; 
    } else if (level >= 9 && level < 13){ 
     result= 4; 
    } else if (level >= 13 && level < 17) { 
     result= 5; 
    } else if (level >= 17 && level <= 20) { 
     result= 6; 
    } 

    return result; 
} 
+0

Ich habe den obigen Code ausprobiert und ich bekomme, dass ich die Variable zweimal ausführen. Nun, was ich als Produkt bekomme, ist eher "4 Proficiency" zu sagen, ich bekomme die ganze Funktion auf den Bildschirm geschrieben. 'Funktionsfähigkeit (Niveau) {var Ergebnis; if (Level> = 1 && Level <5) {Ergebnis = 2; } sonst if (level> = 5 && level <9) {result = 3; } sonst if (level> = 9 && level <13) {result = 4; } sonst if (level> = 13 && level <17) {result = 5; } sonst if (level> = 17 && level <= 20) {result = 6; } Ergebnis zurückgeben; } Proficiency ' – user3605374

+0

Ich verstehe nicht, was Sie damit meinen, was Sie als Ergebnis erhalten im Vergleich zu dem, was Sie erwarten. Sie formatieren Code leider nicht so in Kommentaren. – krillgar

0

Wie MDN betont:

A function declaration also creates a variable with the same name as the function name. Thus, unlike those defined by function expressions, functions defined by function declarations can be accessed by their name in the scope they were defined in.

So, nachdem Sie Ihre Funktion einmal ausgeführt, Sie effektiv die Funktion zerstören. Sie können dies sehen, indem Sie vor und nach dem ersten Aufruf der Funktion console.log(typeof proficiency) protokollieren. Beim ersten Mal erhalten Sie function, beim zweiten Mal erhalten Sie number.

Lösung? Verwenden Sie einen anderen Variablennamen als proficiency innerhalb der Funktion.

1

Indem Sie in Ihrer Funktion proficiency = X; tun, erstellen Sie eine globale Variable namens proficiency, die keine Funktion ist. Sie sollten es in den Rahmen der Funktion deklarieren, indem das Schlüsselwort var:

function proficiency(level) { 
    var proficiency; 
    if (level >= 1 && level < 5) { 
    /* ... */ 
} 
0

ich erkannte, was ich falsch mache.

Ja, ich musste die Funktion (Kompetenz) von der Variablen (Kompetenz) unterscheiden. Erledigt. Aber dann bekam ich Müll, bis ich realisierte, was für ein Tölpel ich war.

Ich brauchte eine Variable in der Rolle der Würfel

var prof = proficiency(level); 

Funktion erstellen Nachdem ich das tat, ich prof innerhalb der jquery.html Anweisung aufgerufen und voila, Problem gelöst. Danke, dass du mir den Weg gezeigt hast.