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