Javascript 函数被调用两次-一次使用正确的值,一次使用错误的值

Javascript 函数被调用两次-一次使用正确的值,一次使用错误的值,javascript,function,conditional,Javascript,Function,Conditional,这是第一篇文章,也是我对编码的新手,所以希望这个问题足够清楚 我正在做一个基本的JavaScript练习。除了一个问题外,这个程序基本上按照我的需要运行 该程序将填充一系列警报。例如,如果您选择“数学”,然后在接下来的三个警报中输入:1、+、1,它将返回“您的答案是2”(这是正确的)。但是后来呢就出现了"啊哦!!问题!!”,这是不对的 我搞不懂为什么会这样 我已将相关代码粘贴到下面。此外,这里还有一个包含所有代码的示例 //////////////// MATHS CALCULATOR ////

这是第一篇文章,也是我对编码的新手,所以希望这个问题足够清楚

我正在做一个基本的JavaScript练习。除了一个问题外,这个程序基本上按照我的需要运行

该程序将填充一系列警报。例如,如果您选择“数学”,然后在接下来的三个警报中输入:1、+、1,它将返回“您的答案是2”(这是正确的)。但是后来呢就出现了"啊哦!!问题!!”,这是不对的

我搞不懂为什么会这样

我已将相关代码粘贴到下面。此外,这里还有一个包含所有代码的示例

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

任何帮助都将不胜感激。

您可以调用
mathCalculate
方法两次

第一次是在
mathSetup
中,另一次是在交换机中的主循环。第二次调用它时没有参数。这就是为什么你们会对这个问题保持警惕

要解决此问题,您必须从
开关
中删除
匹配计算
。另一种方法是从
mathSetup
返回数据,并在
mathCalculate

我还做了小提琴:

我从
mathSetup
返回数据,并在
mathCalculate
中使用它:

const [operator, firstNumber, secondNumber] = mathSetup();
mathCalculate(operator, firstNumber, secondNumber);
注意,我使用了解构。此语法是ECMAScript 2015的一部分,因此只能在少数现代浏览器中使用


UPD:我强烈建议在这种情况下使用
debugger
关键字。你的代码有很多行,我生平第一次看到它,但由于
调试器
关键字和Chrome开发工具,我能够在30秒内找到错误。

你调用
mathCalculate
方法两次

第一次是在
mathSetup
中,另一次是在交换机中的主循环。第二次调用它时没有参数。这就是为什么你们会对这个问题保持警惕

要解决此问题,您必须从
开关
中删除
匹配计算
。另一种方法是从
mathSetup
返回数据,并在
mathCalculate

我还做了小提琴:

我从
mathSetup
返回数据,并在
mathCalculate
中使用它:

const [operator, firstNumber, secondNumber] = mathSetup();
mathCalculate(operator, firstNumber, secondNumber);
注意,我使用了解构。此语法是ECMAScript 2015的一部分,因此只能在少数现代浏览器中使用


UPD:我强烈建议在这种情况下使用
debugger
关键字。你的代码有很多行,我一生中第一次看到它,但由于
调试器
关键字和Chrome Devtools,我能够在30秒内找到错误。

你调用了两次计算函数

设置功能中的一个

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

从开关盒中删除计算功能,此时您没有关于计算的信息。Fiddle link-

您调用了两次计算函数

设置功能中的一个

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

从开关盒中删除计算功能,此时您没有关于计算的信息。Fiddle link-

导致问题的代码位不包括在您的问题中。您不应该在运行循环中没有参数的情况下,在
mathSetup()
之后调用
mathCalculate()
mathSetup()
稍后正确调用它。太棒了,谢谢!这是有道理的。导致问题的代码位不包括在您的问题中。您不应该在运行循环中没有参数的情况下,在
mathSetup()
之后调用
mathCalculate()
mathSetup()
稍后正确调用它。太棒了,谢谢!这很有道理,谢谢你!这很有道理。我添加了fiddle如何在函数之间返回和传递值。我还添加了关于
调试器
关键字和devtoolsGreat的说明,谢谢。调试器非常有用,我不知道这个关键字。你用来在函数之间传递值的方法比我在函数中调用函数的方法更好(除了ES 2015的警告),我不认为这些词更好。我认为名为setup的函数必须执行setup,名为calculate的函数必须执行计算。我认为这是关于设计的。你的代码工作得太完美了谢谢!这很有道理。我添加了fiddle如何在函数之间返回和传递值。我还添加了关于
调试器
关键字和devtoolsGreat的说明,谢谢。调试器非常有用,我不知道这个关键字。你用来在函数之间传递值的方法比我在函数中调用函数的方法更好(除了ES 2015的警告),我不认为这些词更好。我认为名为setup的函数必须执行setup,名为calculate的函数必须执行计算。我认为这是关于设计的。你的代码工作得太完美了