1

我被困在一个要求创建一个简单计算器的练习上。用户输入被委托给一个单独的函数,这样我就可以将程序扩展到减法、乘法和除法,而无需重复行。

错误是:

“未捕获的 ReferenceError:未定义 x”

<!DOCTYPE HTML>
<html>
    <head>
        <title>Lesson 6 Lab Exercise 3 - Calculator with user input</title>
            <script language="javascript" type="text/javascript">
                function getNumbers()
                {
                    var x = prompt("Enter the first number:");
                    var y = prompt("Enter the second number:");
                    x = parseInt(x);
                    y = parseInt(y);
                }

                function addition()
                {
                    getNumbers();   
                    document.write(x + "+" + y + "=" + (x+y));
                }
            </script>
    </head>
    <body>
        <input type="button" value="Add" onclick="addition()">
    </body>
</html>
4

4 回答 4

4

正如其他答案所说,您应该从一个函数传递xy另一个函数。我不同意 zmo 使用数组的方法,所以这里有一个简短的对象选项(与 karthikr 的帖子的主要区别在于它更短):

function getNumbers()
{
    var x = prompt("Enter the first number:");
    var y = prompt("Enter the second number:");
    x = parseInt(x);
    y = parseInt(y);
    return { x: x, y: y };
}

function addition()
{
    var numbers = getNumbers();   
    document.write(numbers.x + "+" + numbers.y + "=" + (numbers.x+numbers.y));
}

评论中要求的一些附加信息:

  1. { x: x, y: y }是使用文字对象表示法(或对象初始值设定项)定义的对象。
    请参阅使用对象初始值设定项 (MDN)

  2. 该语法的一般形式是{ property1: value1, property2: value2 /*, etc*/ }. 这基本上定义了一个允许您value1使用键的映射property1(类似于其他语言中的哈希表/字典)。
    因此{ x: x }定义了一个对象,其中属性的值x等于名为的变量x。这可能有点令人困惑,但属性名称和值是完全独立的东西,此时恰好有相同的名称。

  3. 定义对象后,您可以使用几种不同的方法访问属性值。最常见的是object.property1object['property1']
    请参阅对象和属性 (MDN)

顺便说一句,如果有比 MDN 更好的教程,请告诉我,我会更新链接。

于 2013-07-01T00:21:30.090 回答
1

对代码进行了一些更正,并添加了检查 x 和 y 是否都是数字。

<!DOCTYPE HTML>
<html>
    <head>
        <title>Lesson 6 Lab Exercise 3 - Calculator with user input</title>
            <script language="javascript" type="text/javascript">
              var Calculator={
                x:0,
                y:0,
                getNumbers:function()
                {
                    // reset x and y
                    this.x=NaN;
                    this.y=NaN;
                    while(isNaN(this.x)){
                      this.x = prompt("Enter the first number:");
                      this.x = parseFloat(this.x);
                    }
                    while(isNaN(this.y)){
                      this.y = prompt("Enter the second number:");
                      this.y = parseFloat(this.y);
                    }
                },
                addition:function()
                {
                    this.getNumbers();   
                    document.write(this.x + "+" + this.y + "=" + (this.x+this.y));
                }
              }
            </script>
    </head>
    <body>
        <input type="button" value="Add" onclick="Calculator.addition()">
    </body>
</html>
于 2013-07-01T00:04:37.770 回答
1

你的问题是,x并且y是在getNumbers()函数的范围内定义的。一个不好的解决方案是在外部范围内声明x和,或者在全局范围内声明最差。一个好的解决方案是从函数y中返回值x并在之后使用它们:ygetNumbers

 function getNumbers() {
     var x = prompt("Enter the first number:");
     var y = prompt("Enter the second number:");
     x = parseInt(x);
     y = parseInt(y);
     return [x, y];
}

function addition(){
    var [x, y] = getNumbers();   
    document.write(x + "+" + y + "=" + (x+y));
}
于 2013-07-01T00:04:54.943 回答
1
                var x;
                var y;
                function getNumbers()
                {
                    x = prompt("Enter the first number:");
                    y = prompt("Enter the second number:");
                    x = parseInt(x);
                    y = parseInt(y);
                }

                function addition()
                {
                    getNumbers();   
                    document.write(x + "+" + y + "=" + (x+y));
                }

在函数外部定义变量,以便它们在两种方法的范围内。您可以在闭包中定义整个代码块,以避免将变量添加到全局空间。

于 2013-07-01T00:00:49.600 回答