2017-05-11 15 views
0

これは最初の投稿であり、私はコーディングに新しいので、うまくいけば問題は十分です。関数が2回呼び出されました - 正しい値で1回、間違った値で1回

私は基本的なJavaScriptの練習をしています。このプログラムは、1つの問題を除いて、私が必要としているように主に働いています。

プログラムは一連のアラートを入力します。たとえば、数学を選択し、次の3つのアラートに1、+、1と入力すると、「あなたの答えは2」(正しい)と返されます。しかしその後、それはその後、「あああ!問題!! 'がありますが、これは正しくありません。

これはなぜ起こっているのですか?

以下の関連コードを貼り付けました。また、コードはすべてhttps://jsfiddle.net/poc4kzm9/です。

//////////////// 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))); 
} 

助けてください。

+2

問題の原因となるコードの一部はあなたの質問に含まれていません。 'mathSet()'の直後に、実行ループ内でパラメータなしで 'mathCalculate()'を呼び出すべきではありません。 'mathSetup()'は後でそれを適切に呼び出します。 https://jsfiddle.net/poc4kzm9/2/ – DarthJDG

+0

素晴らしい、ありがとう!それは理にかなっている。 –

答えて

2

mathCalculateメソッドを2回呼び出します。

初回はmathSetupで、もう1つはスイッチのメインループです。 2回目はパラメータなしで呼び出します。それはあなたが問題について警戒する理由です。

これを修正するには、matchCalculateswitchから削除する必要があります。 https://jsfiddle.net/5bh9ndhc/

私はmathSetupからデータを返されたと私はmathCalculateでそれを使用します:私が使用

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

注意をもう一つの方法は、mathSetupからデータを返すと私はまた、フィドル作らmathCalculate

でそれを使用することです割り当てを破棄する。この構文はECMAScript 2015に含まれているため、一部の最新のブラウザでのみ動作します。

UPD:このような場合は、キーワードdebuggerを使用することを強くおすすめします。あなたのコードには多くの行があり、私の人生では初めてですが、debuggerキーワードとChrome Devtoolsのために、私は30秒で間違いを見つけることができました。

+0

ありがとう!それは理にかなっている。 –

+0

関数間で戻り値と値を渡す方法を追加しました –

+0

私は 'debugger'キーワードとdevtoolsに関する注釈も追加しました –

0

あなたが二回

セットアップ関数の中の一つ

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); 
} 

とセットアップ後

mathSetup(); 
    mathCalculate(); 

は、あなたが持っていないその時点でスイッチケースから計算機能を削除する関数を計算呼んでいます計算に関する情報。フィドルリンク - https://jsfiddle.net/ezmhc0ff/

関連する問題