这块是什么意思,老师给每个地方注释一下呗

这块是什么意思,老师给每个地方注释一下呗

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>计算器</title>
    <style>
        body{
            background-color: #eee;
        }
        .calculator{
            margin: 200px 0 0 330px;
        }
    </style>
</head>
<body>
    <div id="calculator" class="calculator">
        <p>
            <input type="text" class="formeInput" value="20">
            <span class="sign">+</span>
            <input type="text" class="laterInput" value="10">
            <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="×" class="btn" title="multiply">
            <input type="button" value="÷" class="btn" title="divide">
        </p>
    </div>
    <script>
        // //第一次改写
        // //获取元素
        // var getElem = function(selector){
        //     return document.querySelector(selector);
        // }
        // var getElems = function(selector){
        //     return document.querySelectorAll(selector);
        // }

        // // 第一个文本框
        // var formeInput = getElem(".formeInput");
        // // 符号
        // var sign = getElem(".sign");
        // // 第二个文本框
        // var laterInput = getElem(".laterInput");
        // // 等于值
        // var resultOutput = getElem(".resultOutput");
        // // 按钮
        // var btn = getElems(".btn");

        // btn[0].onclick = addHandler;
        // btn[1].onclick = subtractHandler;
        // btn[2].onclick = multiplyHandler;
        // btn[3].onclick = divideHandler;

        // function addHandler(){
        //     sign.innerHTML = "+";
        //     resultOutput.innerHTML = +formeInput.value + +laterInput.value;
        // }
        // function subtractHandler(){
        //     sign.innerHTML = "-";
        //     resultOutput.innerHTML = +formeInput.value - +laterInput.value;
        // }
        // function multiplyHandler(){
        //     sign.innerHTML = "×";
        //     resultOutput.innerHTML = +formeInput.value * +laterInput.value;
        // }
        // function divideHandler(){
        //     sign.innerHTML = "÷";
        //     resultOutput.innerHTML = +formeInput.value / +laterInput.value;
        // }

        // //第二次改写-循环
        // //获取元素
        // var getElem = function(selector){
        //     return document.querySelector(selector);
        // }
        // var getElems = function(selector){
        //     return document.querySelectorAll(selector);
        // }

        // // 第一个文本框
        // var formeInput = getElem(".formeInput");
        // // 符号
        // var sign = getElem(".sign");
        // // 第二个文本框
        // var laterInput = getElem(".laterInput");
        // // 等于值
        // var resultOutput = getElem(".resultOutput");
        // // 按钮
        // var btn = getElems(".btn");

        // for(var i=0;i<btn.length;i++){
        //     btn[i].onclick = function(){
        //         switch(this.title){
        //             case "add":
        //             addHandler();break;
        //             case "subtract":
        //             subtractHandler();break;
        //             case "multiply":
        //             multiplyHandler();break;
        //             case "divide":
        //             divideHandler();break;
        //         }
        //     }
        // }
        // // btn[0].onclick = addHandler;
        // // btn[1].onclick = subtractHandler;
        // // btn[2].onclick = multiplyHandler;
        // // btn[3].onclick = divideHandler;

        // function addHandler(){
        //     sign.innerHTML = "+";
        //     resultOutput.innerHTML = +formeInput.value + +laterInput.value;
        // }
        // function subtractHandler(){
        //     sign.innerHTML = "-";
        //     resultOutput.innerHTML = +formeInput.value - +laterInput.value;
        // }
        // function multiplyHandler(){
        //     sign.innerHTML = "×";
        //     resultOutput.innerHTML = +formeInput.value * +laterInput.value;
        // }
        // function divideHandler(){
        //     sign.innerHTML = "÷";
        //     resultOutput.innerHTML = +formeInput.value / +laterInput.value;
        // }

        // 第三次改写-提取函数
        //获取元素
        var getElem = function(selector){
            return document.querySelector(selector);
        }
        var getElems = function(selector){
            return document.querySelectorAll(selector);
        }

        // 第一个文本框
        var formeInput = getElem(".formeInput");
        // 符号
        var sign = getElem(".sign");
        // 第二个文本框
        var laterInput = getElem(".laterInput");
        // 等于值
        var resultOutput = getElem(".resultOutput");
        // 按钮
        var btn = getElems(".btn");

        each(btn,function(index,elem){
            elem.onclick = function(){
                switch(this.title){
                    case "add":
                    addHandler();break;
                    case "subtract":
                    subtractHandler();break;
                    case "multiply":
                    multiplyHandler();break;
                    case "divide":
                    divideHandler();break;
                }
            }
        });

       function each(array,fn){
           for(var i=0;i<array.length;i++){
               fn(i,array[i]);
           }
       }

       //封装一个加减乘除的函数
       function updateSign(symbol){
           sign.innerHTML = symbol;
       }
       updateSign("+");
       updateSign("-");
       updateSign("×");
       updateSign("÷");

       //封装一个算法的函数
       function add(num1,num2){
        return +num1 + +num2;
       }
       function subtract(num1,num2){
        return num1 - num2;
       }
       function multiply(num1,num2){
        return num1 * num2;
       }
       function divide(num1,num2){
        return num1 / num2;
       }

       //封装一个结果的函数
       function outputResult(result){
           resultOutput.innerHTML = result;
       }

       //加
        function addHandler(){
            updateSign("+");
            outputResult(add(formeInput.value,laterInput.value))
        }
        //减
        function subtractHandler(){
            updateSign("-");
            outputResult(subtract(formeInput.value,laterInput.value))
        }
        //乘
        function multiplyHandler(){
            updateSign("×");
            outputResult(multiply(formeInput.value,laterInput.value))
        }
        //除
        function divideHandler(){
            updateSign("÷");
            outputResult(divide(formeInput.value,laterInput.value))
        }
    </script>
</body>
</html>

http://img1.sycdn.imooc.com//climg/5ed8c46309cb980006260511.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,解答如下:

1、注释如下:

// 封装for循环为each函数。第一个参数传入的是数组,第二个参数传入的是一个函数。
    function each(array, fn) {
    	// console.log(fn) 可以打印看下
        for (var i = 0; i < array.length; i++) {
        	//fn是和each的function是同一个函数。将fn回调函数作为一个整体,当作第二个参数传给了each函数
            fn(i, array[i]);
        }
    }
    // 调用each方法,传入两个参数,一个是array->btn;一个是函数fn->function(index, elem){}
    each(btn, function(index, elem) {
    	// 函数有两个参数,一个是索引,一个是4个按钮
        elem.onclick = function() {
        	// 通过switch方法实现 根据不同条件,调用不同方法
            switch (this.title) {
                case "add":
                    addHandler();
                    break;
                case "subtract":
                    subtractHandler();
                    break;
                case "multiply":
                    multiplyHandler();
                    break;
                case "divide":
                    divideHandler();
                    break;
            }
        }
    });


2、为什么要用fn?函数得先调用才会执行,定义了一个each函数,先使用each()调用并传入两个实参。each的实参把值赋值给实参。然后fn就是一个匿名函数,函数中调用了fn()就会为元素绑定点击事件了可 参考下图:

http://img1.sycdn.imooc.com//climg/5ed8cd28096008c707670728.jpg

3、视频中这样的操作, 其实是想传达一个实践中推荐的编程方法,即组件化。 可能用于现在的计算机项目里面,有一些多余。 但是实际中换成是一个大型的项目,可能拆分封装成小的函数会更好,一方面可读性和逻辑性更强, 当团队开发的时候,其他的同事来看我们的代码,就不需要去深入掰清楚每一行代码代表的含义, 只需要通过函数名就能够知道实现什么功能, 节约阅读效率。

如果我的回答帮到了你,欢迎采纳,祝学习愉快~

  • 宝慕林3013065 提问者 #1
    那其实他俩的书写顺序是不是返的,先给each传参数,一个是i,一个是array[i],然后each里面的两个形参array等于btn,fn等于function(index,elem)这个函数,,也就是说fn里面的i等于index,array[i]等于elem,当点击数组里面的按钮时,btn跟着变化,那index,也就是i的作用是啥呢,不知道老师能看懂我想表达的意思吗。。。
    2020-06-05 09:06:05
  • 好帮手慕码 回复 提问者 宝慕林3013065 #2
    同学你理解的是正确的;另,在for循环中调用的fn,由于传入的“i”没用上,所以可以去掉传递的参数i,只传入一个形参array[i]。
    2020-06-05 10:52:50
提问者 宝慕林3013065 2020-06-04 17:54:22

http://img1.sycdn.imooc.com//climg/5ed8c4a90921f15a05640214.jpg

还有这个地方为啥要用fn呢,感觉这么写完之后比上一个循环的代码量要多了呢,有啥意义吗

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师