JS学习(上)|青训营笔记

69 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第2天

「深入了解JavaScript」

写好JS的一些原则(本节课学习主线):

  • 各司其责:让HTML,CSS和JS职能分离
  • 组件封装: 好的UI组件具备正确性,扩展性,复用性
  • 过程抽象:应用函数式编程思想

一.各司其责

  • 应当避免不必要的由JS直接操作样式
  • 可以用class表示状态
  • 纯展示类交互需求零JS方案

二.组件封装

  • 结构设计——定义HTML结构
  • 展现效果——定义CSS样式
  • 行为设计——
    • 定义JS API(功能)
    • 定义JS event(控制流):使用自定义事件来解耦

如何优化

  • 重构:插件化
    • 将控制元素抽取成插件

    • 插件与组件之间通过依赖注入方式建立联系

如何进一步优化...

  • 重构:模板化
    • 将HTML模板化,更易于拓展

如何再进一步优化...

  • 抽象:组件框架
    • 将组件通用模型抽象出来

老师总结: 组件设计的原则:封装性,正确性,扩展性,复用性; 实现组件的步骤:结构设计,展现效果,行为设计; 三次重构:插件化->模板化->抽象化

三.过程抽象

  • 用来处理局部细节控制的一些方法
  • 函数式编程思想的基础应用

过程抽象举例:为了能够让"只执行一次"的需求覆盖不同的事件处理,我们将这个需求剥离出来,这个过程我们成为过程抽象

  • once单次执行:
function once(fn){
    return function(...args){
        if(fn){
               const ret=fn.apply(this,args);
               fn =null;
               return ret;
        }
 }
  • Throttle 节流函数
function throttle(fn,time=500){
    let timer;
    return function(...args){
        if(timer===null){
               fn.apply(this,args);
               timer =setTimeOut(()=>{
                   timer=null
               },time)
        }
 }
  • debounce防抖函数
function debounce(fn,dur){
   dur=dur||100;
   let timer;
   return function(...args){
       clearTimeOut(timer);
       timer =setTimeOut(()=>{
                   fn.apply(this,args);
              },dur)
      }
}
  • consumer 延时函数

  • isIterable 可迭代函数


思考

  • 为什么要使用高阶函数?

    纯函数的优点——结果是可预期的,不会因为外界原因改变,只与参数有关

    非纯函数会造成代码可读性差,结果不可预期,所以需要用高阶函数将非纯函数转化为纯函数,提高代码可维护性。


命令式编程与声明式编程 声明式编程存在自带的优于命令式编程的可扩展性

老师总结: 过程抽象/HOF/装饰器;命令式/声明式


个人总结

今天上的是JS上部分的内容,跟月影老师学习了JS的一些概念,举例讲解了HTML,css和JS的定位分工,同时区别于网上许多课程的内容,老师后半节课于讲一些JS内部的特性,收获很多,期待JS下的课程