简体   繁体   English

带有一些按钮的计算器 JavaScript

[英]Calculator with some Button in JavaScript

I want to make a Calculator in JS.我想用 JS 做一个计算器。 I'm new to JS and I don't get it why it isn't working.我是 JS 的新手,我不明白为什么它不起作用。 In the Browser Console I get undefined if I call add().在浏览器控制台中,如果我调用 add(),我将得到未定义。
getInputAsNumber(...) should retrieves the input value from the field with the ID passed as Parameter writeResult() writes the calculated result to the output field and is used in all operations getInputAsNumber(...) 应该从字段中检索输入值,ID 作为参数传递 writeResult() 将计算结果写入 output 字段,并在所有操作中使用

 "use strict"; function add() { let operator1; let operator2; getInputAsNumber(operator1, operator2); let summe = operator1 + operator2; writeResult(summe); } function getInputAsNumber(op1, op2) { op1 = document.getElementById("op1").value; op2 = document.getElementById("op2").value; } function writeResult(result) { let outputElement = document.getElementById("output1"); outputElement.innerHTML = Number.result; }
 <form> <h1>Calculator with Buttons</h1> <label>Operand 1:</label> <input id="op1" type="number"> <br> <br> <label>Operand 2:</label> <input id="op2" type="number"> <br> <br> <label>Operators: </label> <button>+</button> <button>-</button> <button>*</button> <button>/</button> <br> <br> <div id="result"> <label>Result: </label> <output id="output1"></output> </div> </form>

You are passing op1 and op2 as a referenced parameter, but they are actually called by value (which means, that they aren't changed when changing inside of the function).您将 op1 和 op2 作为引用参数传递,但它们实际上是按值调用的(这意味着,在函数内部更改时它们不会更改)。 You get undefined because operator1 and operator2 are only declared (not initialized.).您得到未定义,因为 operator1 和 operator2 仅被声明(未初始化)。

You can modify your function so that it returns both operators (instead of passing them):您可以修改 function 以便它返回两个运算符(而不是传递它们):

 function add() { let {operator1, operator2} = getInputAsNumber(); let summe = operator1 + operator2; writeResult(summe); } function getInputAsNumber() { const op1 = document.getElementById("op1").value; const op2 = document.getElementById("op2").value; return {operator1: parseFloat(op1), operator2: parseFloat(op2)}; } function writeResult(result) { let outputElement = document.getElementById("output1"); outputElement.innerHTML = result; }
 <h1>Calculator with Buttons</h1> <label>Operand 1:</label> <input id="op1" type="number"> <br> <br> <label>Operand 2:</label> <input id="op2" type="number"> <br> <br> <label>Operators: </label> <button onClick="add()">+</button> <button>-</button> <button>*</button> <button>/</button> <br> <br> <div id="result"> <label>Result: </label> <output id="output1"></output> </div>

This function returns an object consisting of operator1 and 2 and using the object unwrapping (left side of the getInputAsNumber call) you can easily fetch the two values.这个 function 返回一个由 operator1 和 2 组成的 object 并使用 object 展开(getInputAsNumber 调用的左侧),您可以轻松获取这两个值。 Additionally: just reading the values of the input field (.value) retrieves a string (,), adding two strings in JavaScript means concatination ("2" + "2" = "22").另外:仅读取输入字段(.value)的值会检索到一个字符串(,),在 JavaScript 中添加两个字符串意味着连接(“2”+“2”=“22”)。 so you need to parse them first.所以你需要先解析它们。

The main issues I can see with your code is that:我在您的代码中看到的主要问题是:

  • you need to either pass op1 and op2 more directly, or [as below] set them globally so that they don't need to be passed at all您需要更直接地传递op1op2 ,或者 [如下] 全局设置它们,以便根本不需要传递它们
  • you can just use result , not Number.result [why the Number.你可以只使用result ,而不是Number.result [为什么Number. in the first place?]首先?]
  • you might need to parse the inputs from string to number using parseInt Then, if you add onclick attributes to your buttons or use enventListener, you can make the calculator work fully您可能需要使用parseInt将输入从字符串解析为数字然后,如果您将onclick属性添加到您的按钮或使用 enventListener,您可以使计算器完全工作

 "use strict"; var operator1; var operator2; function calcOp(operator) { getInputAsNumber(); var op; if (operator == 'add') { writeResult(operator1 + operator2); } else if (operator == 'sub') { writeResult(operator1 - operator2); } else if (operator == 'mul') { writeResult(operator1 * operator2); } else if (operator == 'div') { writeResult(operator1 / operator2); } } function getInputAsNumber() { operator1 = parseInt(document.getElementById("op1").value); operator2 = parseInt(document.getElementById("op2").value); } function writeResult(result) { let outputElement = document.getElementById("output1x"); outputElement.value = result; }
 <h1>Calculator with Buttons</h1> <label>Operand 1:</label> <input id="op1" type="number"> <br> <br> <label>Operand 2:</label> <input id="op2" type="number"> <br> <br> <label>Operators: </label> <button onclick="calcOp('add');">+</button> <button onclick="calcOp('sub');">-</button> <button onclick="calcOp('mul');">*</button> <button onclick="calcOp('div');">/</button> <br> <br> <div id="result"><label>Result: </label><output id="output1x"></output></div>

I changed your add function to calcOp because all the operations would have very similar, but if you just wanted to have add :我将您的add function 更改为calcOp因为所有操作都非常相似,但如果您只想add

function add() {
    getInputAsNumber();
    let summe = operator1 + operator2;
    writeResult(summe);
}

[Also, as one of the comments mentioned, if you wrap it as a form the way you did, it will likely disappear after any operation. [此外,正如其中提到的评论之一,如果您按照您的方式将其包装为一种form ,它可能会在任何操作后消失。 Just div will look the same and not disappear]只是div看起来一样,不会消失]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM