请问老师这里为什么计算结果是undefined

来源:4-6 第五次修改--开放与封闭原则

不明道理

2020-07-19 11:25:16

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            background-color: #eee;
            /*position: relative;*/
        }
        #calculator{
            width: 600px;
            margin:0 auto;
            position: absolute;
            top:50%;
            margin-top: -31px;
            left:50%;
            margin-left: -300px;
        }
    </style>
</head>

<body>
    <div id="calculator">
        <p>
            <input type="text" class="formerInput" value="1">
            <span class="sign">+</span>
            <input type="text" class="laterInput" value="1">
            <span>=</span>
            <span class="resultOutput">2</span>
        </p>
        <p>
            <input type="button" value="+" class='btn' title='add'>
            <input type="button" value="-" class='btn' title='subtract'>
            <input type="button" value="x" class='btn' title='multiply'>
            <input type="button" value="÷" class='btn' title='divide'>
            <input type="button" value="%" class='btn' title='mod'>
        </p>
    </div>
    <script>
    //获取元素

    var wrapElem = document.querySelector('#calculator');

    var calculatorElem = {
        formerInput: wrapElem.querySelector('.formerInput'),
        sign: wrapElem.querySelector('.sign'),
        laterInput: wrapElem.querySelector('.laterInput'),
        resultOutput: wrapElem.querySelector('.resultOutput'),
        btns: wrapElem.querySelectorAll('.btn')
    }

    function each(array, fn) {
        for (var i = 0; i < array.length; i++) {
            fn(array[i])
        }
    }
    each(calculatorElem.btns, function(elem) {
        elem.onclick = function() {
            updataSign(this.value);
            outputResult(operate(this.title, calculatorElem.formerInput.value, calculatorElem.laterInput.value));
        }
    });
    //更新符号
    function updataSign(symbol) {
        calculatorElem.sign.innerHTML = symbol;
    }

    function operate(name, num1, num2) {
        if (!operation[name]) throw new Error('不存在名为' + name + '的运算方法');
        operation[name](num1, num2); //计算结果为undefined
        //return operation[name](num1, num2);
    }
    var operation = {
        add: function(num1, num2) {
            return +num1 + +num2;
        },
        subtract: function(num1, num2) {
            return num1 - num2;
        },
        multiply: function(num1, num2) {
            return num1 * num2;
        },
        divide: function(num1, num2) {
            return num1 / num2;
        },
        mod:function(num1,num2){
            return num1 % num2;
        }
    }

    //输出结果
    function outputResult(result) {
        calculatorElem.resultOutput.innerHTML = result;
    }
    </script>
</body>

</html>

______________________________________________________________________________________________________

   function operate(name, num1, num2) {
       if (!operation[name]) throw new Error('不存在名为' + name + '的运算方法');
       operation[name](num1, num2); //计算结果为undefined
       //return operation[name](num1, num2);
   }

operate()函数没有return 的时候计算结果是undefined

http://img.mukewang.com/climg/5f13bbb709d4bced08860248.jpg但是我的理解执行operation[name](num1, num2);这段代码的时候,name实参为this.title。比如点击‘+’按钮,这里name的值为add,即这行代码执行的时候为add(calculatorElem.formerInput.value,calculatorElem.laterInput.value);

    var operation = {

        add: function(num1, num2) {

            return +num1 + +num2;

        },

函数是有返回值的,所以operate()函数应该不用return

写回答

1回答

好帮手慕码

2020-07-19

同学你好,是因为operate方法没有返回值,所以计算结果为undefined。另,同学理解的不太正确,return是不会传递

虽然在operate方法中,调用operation[name],operation中返回值,是可以得出计算结果的:

http://img.mukewang.com/climg/5f13c27e09ee5b3306440087.jpg

但是,点击事件elem.onclick调用operate方法的时候,也需要返回值,不过这里没有设置,所以无法输出计算结果。

http://img.mukewang.com/climg/5f13c3470959f79e12610656.jpg

同学可以再理解一下。祝学习愉快~

0

0 学习 · 14456 问题

查看课程