【问题标题】:Function being called twice - once with correct value, once with wrong value函数被调用两次 - 一次具有正确的值,一次具有错误的值
【发布时间】:2017-10-11 03:12:57
【问题描述】:

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

我正在做一个基本的 JavaScript 练习。该程序在很大程度上是因为我需要它来解决一个问题。

程序会填充一系列警报。例如,如果您选择数学,然后在接下来的三个警报中输入: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)));
}

任何帮助将不胜感激。

【问题讨论】:

  • 导致问题的代码位未包含在您的问题中。你不应该在你的运行循环中调用mathCalculate(),而不是在mathSetup()之后。 mathSetup() 稍后会正确调用它。 jsfiddle.net/poc4kzm9/2
  • 太棒了,谢谢!这是有道理的。

标签: javascript function conditional


【解决方案1】:

你调用了两次mathCalculate 方法。

第一次是在mathSetup,另一个是你在 switch 中的主循环。第二次不带参数调用它。这就是您对问题保持警惕的原因。

要解决此问题,您必须从 switch 中删除 matchCalculate。另一种方法是从mathSetup返回数据并在mathCalculate中使用

我也做了fiddle:https://jsfiddle.net/5bh9ndhc/

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

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

请注意,我使用了解构赋值。此语法是 ECMAScript 2015 的一部分,因此仅适用于少数现代浏览器。

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

【讨论】:

  • 谢谢!这是有道理的。
  • 我添加了 fiddle 如何在函数之间返回和传递值
  • 我还添加了关于 debugger 关键字和开发工具的注释
  • 太好了,谢谢。调试器非常有用,我不知道这个关键字。您用来在函数之间传递值的方法比我在函数中调用函数的方法更好(除了 ES 2015 警告)?
  • 我不认为单词更好。我认为名称设置的函数必须进行设置,名称计算的函数必须进行计算。我认为它与设计有关。您的代码将运行得太完美了
【解决方案2】:

你调用了两次计算函数

setup函数里面的一个

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/

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多