2017-05-11 6 views
0

Dies ist ein erster Beitrag und auch ich bin neu im Codieren, also ist die Frage hoffentlich klar genug.Funktion wird zweimal aufgerufen - einmal mit korrektem Wert, einmal mit falschem Wert

Ich mache eine grundlegende JavaScript-Übung. Das Programm arbeitet weitgehend so, wie ich es brauche, um ein Problem zu lösen.

Das Programm füllt eine Reihe von Alarmen auf. Wenn Sie beispielsweise Mathematik auswählen und dann in den nächsten drei Warnungen 1, +, 1 eingeben, wird "Ihre Antwort ist 2" zurückgegeben (was korrekt ist). Dann aber zeigt es später das "Uh oh! Problem !! ", was nicht stimmt.

Ich kann nicht herausfinden, warum das passiert?

Ich habe den entsprechenden Code unten eingefügt. Auch eine https://jsfiddle.net/poc4kzm9/ mit dem ganzen Code ist hier.

//////////////// MATHS CALCULATOR ////////////////////////// 

// logic for maths calculation 
function mathCalculate(operator, firstNumber, secondNumber) { 
    console.log(operator); 
    if (operator === '+') { 
    add(firstNumber, secondNumber); 
    } else if (operator === '-') { 
    subtract(firstNumber, secondNumber); 
    } else if (operator === '/') { 
    divide(firstNumber, secondNumber); 
    } else if (operator === '*') { 
    multiply(firstNumber, secondNumber); 
    } else if (operator === 'sq') { 
    power(firstNumber, secondNumber); 
    } else if (operator ==='sqrt') { 
    squareRoot(firstNumber); 
    } else { 
    alert('Uh oh! Problem!!'); 
    } 
} 

// collect required values for math 
function mathSetup() { 
    // Set intial values for math calculator 
    const firstNumber = prompt('What is your first number?'); 
    const operator = prompt('Which operator would you like to use? (+, -, /, *, sq, sqrt)'); 
    let secondNumber; 

    // No need for a second number if sqrt-ing the first value 
    if (operator !== 'sqrt') { 
    secondNumber = prompt('What is your second number?'); 
    } 
    mathCalculate(operator, firstNumber, secondNumber); 
} 

// The various functions by operator, one for each operator 
function add(a,b) { 
    alert('Answer is ' + (parseFloat(a) + parseFloat(b))); 
} 

Jede Hilfe wäre willkommen.

+2

Das Bit des Codes, das das Problem verursacht, ist nicht in Ihrer Frage enthalten. Sie sollten 'mathCalculate()' nicht ohne Parameter in Ihrer Laufschleife aufrufen, direkt nach 'mathSetup()'. 'mathSetup()' ruft es später richtig auf. https://jsfiddle.net/poc4kzm9/2/ – DarthJDG

+0

Erstaunlich, danke! Das macht Sinn. –

Antwort

2

Sie rufen mathCalculate Methode zweimal auf.

Das erste Mal ist in mathSetup und ein anderes ist Ihre Hauptschleife im Schalter. Beim zweiten Aufruf ohne Parameter. Deshalb werden Sie auf das Problem aufmerksam gemacht.

Um dies zu beheben, müssen Sie matchCalculate von switch entfernen. Eine weitere Möglichkeit ist, Daten von mathSetup zurückzukehren und verwenden Sie es in mathCalculate

Ich habe Geige auch: https://jsfiddle.net/5bh9ndhc/

ich zurückgegebenen Daten von mathSetup und ich benutze es in mathCalculate:

const [operator, firstNumber, secondNumber] = mathSetup(); 
mathCalculate(operator, firstNumber, secondNumber); 

Anmerkung, die ich verwendet Destrukturierung Assignmen. Diese Syntax ist Teil von ECMAScript 2015 und funktioniert daher nur in einigen modernen Browsern.

UPD: Ich empfehle in solchen Fällen dringend debugger Schlüsselwort. Ihr Code hat viele Zeilen und ich sehe es das erste Mal in meinem Leben, aber wegen debugger Schlüsselwort und Chrome Devtools konnte ich den Fehler in 30 Sekunden finden.

+0

Danke! Das macht Sinn. –

+0

Ich habe Fiedel hinzugefügt, wie Sie Werte zwischen Funktionen zurückgeben und übergeben können –

+0

Ich habe auch eine Notiz über 'Debugger' Schlüsselwort und Devtools hinzugefügt –

0

Sie Funktion zweimal berechnen rufen

One innerhalb der Setup-Funktion

function mathSetup() { 
    // Set intial values for math calculator 
    const firstNumber = prompt('What is your first number?'); 
    const operator = prompt('Which operator would you like to use? (+, -, /, *, sq, sqrt)'); 
    let secondNumber; 

    // No need for a second number if sqrt-ing the first value 
    if (operator !== 'sqrt') { 
    secondNumber = prompt('What is your second number?'); 
    } 
    mathCalculate(operator, firstNumber, secondNumber); 
} 

und nach der Einrichtung

mathSetup(); 
    mathCalculate(); 

Remove berechnen Funktion von Schaltergehäuse an diesem Punkt Sie nicht haben Informationen zur Berechnung. Fiddle Link - https://jsfiddle.net/ezmhc0ff/

Verwandte Themen