【跟着月影学JavaScript(1-5) | 青训营笔记】

70 阅读3分钟

这是我参与【第五届青训营】伴学笔记创作活动的第3天。

本堂课的重点内容:
  1. JavaScript编码原则之各司其责
  2. JavaScript编码原则之组件封装
  3. JavaScript编码原则之过程抽象
  4. Leftpad事故背景引入
  5. JavaScript代码质量优化之路
详细知识点介绍:
  1. 各司其责:
  • HTML/CSS/JS各司其责
  • 应当避免不必要的由JS直接操作样式
  • 可以用class来表示状态
  • 纯展示类交互寻求零JS方案
  1. 组件封装:
  • 组件是指Web页面上抽出来一个个包含模板(HTML),功能(JS)和样式(CSS)的单元,好的组件具有封装性,正确性,扩展性,复用性
  • 组件封装的基本方法:
    • 结构设计(HTML)
    • 展现效果(CSS)
    • 行为设计(JS)
      • API(功能)应保证原子操作,职责单一,满足灵活性
      • Event(控制流)使用自定义事件来解耦
  • 组件设计的原则:封装性,正确性,扩展性,复用性
  • 三次重构:
    • 插件化
    • 模块化
    • 抽象化(组件框架)
  1. 解耦:
  • 将控制元素抽取成插件
  • 插件与组件之间通过依赖注入方式建立联系
  • 将HTML模板化,更易于扩展
  1. 抽象:将通用的组件模型抽象出来
  2. 过程抽象(Once):
  • 用来处理局部细节控制的一些方法
  • 函数式编程思想的基础应用
  • 为了能够让“只执行一次”的需求覆盖不同的事件处理,我们可以将这个需求剥离出来,这个过程称为过程抽象
  1. 高阶函数
  • 以函数作为参数
  • 以函数作为返回值
  • 常用于作为函数修饰器
  • 常用高阶函数
    • Once(过程抽象)

         function once(fn,context){
                let res;
                return function(){
                    if(fn){
                        res=context?fn.apply(context,arguments):fn(...arguments)
                        fn=null
                    }
                    return res;
                }
            }
      
    • Throttle(节流):限制一个函数在一定时间内只能执行一次

        var throttle = function (fn, delay) {
            var timer = null;
            return function () {
                clearTimeout(timer);
                timer = setTimeout(function() {
                    fn();
                }, delay);
            }
        };
        var f = throttle(testFn, 200);
        window.onresize = function () {
            f();
        };
      
    • Debounce(防抖):指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间

        function debounce(fn,wait){
            var timer = null;
            return function(){
                if(timer !== null){
                    clearTimeout(timer);
                }
                timer = setTimeout(fn,wait);
            }
        }
      
        function handle(){
            console.log(Math.random());
        }
      
        window.addEventListener("resize",debounce(handle,1000));
      
    • Consumer/2(这个有点知识盲区了,没学好)

    • Iterative(迭代函数):让函数支持多个参数迭代求解

           function add(x, y){
                return x + y;
        }
        function sub(x, y){
                return x - y;
        }
      
        console.log(add(add(add(1,2),3),4));//不好!!
        console.log([1, 2, 3, 4].reduce(add));
        console.log([1, 2, 3, 4].reduce(sub));
      
        //------------------------------------------------
      
        function iterative(fn){
                return function(...args){
                        return args.reduce(fn.bind(this));
                }
        }
      
        const add = iterative((x, y)=> x + y);
        const sub = iterative((x, y)=> x - y);
        console.log(add(1,2,3,4));
        console.log(sub(1,2,3,4));
      
  1. 编程范式
  • 命令式:一种描述计算机所需作出的行为的编程典范,即一步一步告诉计算机先做什么再做什么。(声明式编程与命令式编程是相对立的,只需要告诉计算机要做什么而不必告诉他怎么做)
  • 声明式:声明式编程与命令式编程是相对立的,只需要告诉计算机要做什么而不必告诉他怎么做
  1. 写代码最应关注点:
  • 风格
  • 效率
  • 约定
  • 使用场景
  • 设计
这是我参与【第五届青训营】伴学笔记创作活动的第3天,知识点好多啊!啊啊啊!感觉这次的学习并不是重点教你如何写JavaScript代码,而是把重点放在如何让JavaScript代码更有原则性,让我们学习掌握系统优化JavaScript代码执行效率的方法,这是我在代码开发前没有真正重视的问题,通过这次学习,让我认识到这部分的重要性,要写好代码,如何规范代码很重要!