-5

我已经尝试制作这个计算器一段时间了,对我来说一切看起来都很好,但无论我检查了多少次代码,它都无法工作。我要疯了!这怎么行不通?当我点击计算时没有任何反应!请帮我解决这个问题!

这是JavaScript:

function calc() {
    var num1, num2;
    var sign = "+";
    var result;

    function getNum1() {
        num1 = document.getElementById('num1').value;
        return Number(num1);
    }
    function getNum2() {
        num2 = document.getElementById('num2').value;
        return Number(num2);
    }
    function getSign() {
        sign = document.getElementById('sign').value;
        return sign;
    }
    function setResult() {
        document.getElementById('result').value = result;
    }
    function doCalc() {

        var num1 = getNum1();
        var num2 = getNum2();

        if(getSign() == "*") {
            result = num1 * num2; 
        }else if(getSign() == "/") {
            result = num1 / num2;
        }else if(getSign() == "-") {
            result = num1 - num2; 
        }else{
            result = num1 + num2;
        }
        setResult();
    }
}
4

3 回答 3

1

确保.value在表单字段和.innerHTML其他所有内容(spans、ps 等)上使用。.innerHTML获取或设置元素的内部。

另外,确保提交按钮有一个事件处理程序onclick——最简单的方法是<input onclick="doCalc();" ... />.

于 2013-01-17T00:45:49.720 回答
1

如果您正在调用doCalc(),则无法访问它,因为它位于calc()函数内部。

如果您正在调用calc(),它不会做任何事情,因为它从不调用doCalc()

如果您将doCalc()调用添加到函数的末尾calc(),并且您的calc()函数是可访问的,那么它将起作用。

于 2013-01-17T00:42:46.897 回答
0

我会尝试解耦 calc() 函数。这是一种解决方法。

var Calculator = {
    "eval" : function(operator, x, y) {
                 switch( operator ) {
                     case "+":
                         return (x + y);
                     case "-":
                         return (x - y);
                 }
             }
}

更好的是,

    var Calculator = {
    "eval" : function(operator) {
                 var args = Array.prototype.slice.call(arguments);
                 args.splice(0,1); // lazy hack to remove the argument for the operator

                 switch( operator ) {
                     case "+":
                         return args.reduce( function(x,y){ return (x + y); } );
                     case "-":
                         return args.reduce( function(x,y){ return (x - y) } );
                 }
             }
}

这种方式更容易重用和测试。

var answer = Calculator.eval( '+', 20, 20, 2 );  // yay, prefix notation

第二个变体使用高阶函数“reduce”,将数组缩减为单个值。

以下是reduce如何工作的步骤。我已经提取了 lambda 函数以使事情更清楚一些。

var arr = [20, 20, 20];
function sum(x, y){ return (x + y); }

function reduceMagic(arr){
    var temp = sum(arr[0], arr[1]);  // temp -> 40
    temp =  sum(temp, arr[2]);       // temp -> 42
    return temp;
}
于 2013-01-17T02:46:04.833 回答