跟着月影学JavaScript | 青训营笔记

76 阅读1分钟

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

7.jpg

一、重点内容

如何写好JavaScript。

二、详细介绍

JavaScript基本规则

  • JavaScript的标识符包括函数名、属性名、参数名、变量名、类名......
    • 第一个字符必须是字母、下划线(_)或美元符号($);
    • 除了第一个字符外,其他位置可以使用Unicode字符。(最好用ASCII编码的字母);
    • 不能和JavaScript的关键字、保留字重名;
    • 可以用 Unicode 转义序列。
  • JavaScript严格区分大小写。

写好JS的一些原则

  1. CSS各司其职:让HTML、CSS和JavaScript职能分离
  2. 组件封装:好的UI组件具备正确性、扩展性、复用性
  3. 过程抽象:应用函数式编程思想

各司其职

前端代码由三部分组成:

  • HTML(超文本标记语言)
  • CSS(级联样式表)
  • JavaScript
    HTML负责网页的内容,比如正文;CSS负责网页的外观,比如字体;而JavaScript则负责让网页动起来,比如在你输入电子邮箱时,提醒你应该输入电话号码。

注意:JavaScript作为一种脚本语言,不能独立运行,但是可以借助浏览器运行(所有Web浏览器都支持JavaScript)。


如果要用原生JS写一个电商网站的轮播图,应该怎么实现呢?

  • HTML

 <div id="my-slider" class="slider-list">
      <ul>
        <li class="slider-list__item--selected">
          <img src="https://p5.ssl.qhimg.com/t0119c74624763dd070.png">
        </li>
        <li class="slider-list__item">
          <img src="https://p4.ssl.qhimg.com/t01adbe3351db853eb3.jpg">
        </li>
        <li class="slider-list__item">
          <img src="https://p2.ssl.qhimg.com/t01645cd5ba0c3b60cb.jpg">
        </li>
        <li class="slider-list__item">
          <img src="https://p4.ssl.qhimg.com/t01331ac159b58f5478.jpg">
        </li>
      </ul>
    </div>
  • CSS

#my-slider{
    position: relative;
    width: 790px;
  }

  .slider-list ul{
    list-style-type:none;
    position: relative;
    padding: 0;
    margin: 0;
  }

  .slider-list__item,
  .slider-list__item--selected{
    position: absolute;
    transition: opacity 1s;
    opacity: 0;
    text-align: center;
  }

  .slider-list__item--selected{
    transition: opacity 1s;
    opacity: 1;
  }
  • JS

  class Slider{
    constructor(id){
      this.container = document.getElementById(id);
      this.items = this.container
      .querySelectorAll('.slider-list__item, .slider-list__item--selected');
    }
    getSelectedItem(){
      const selected = this.container
        .querySelector('.slider-list__item--selected');
      return selected
    }
    getSelectedItemIndex(){
      return Array.from(this.items).indexOf(this.getSelectedItem());
    }
    slideTo(idx){
      const selected = this.getSelectedItem();
      if(selected){ 
        selected.className = 'slider-list__item';
      }
      const item = this.items[idx];
      if(item){
        item.className = 'slider-list__item--selected';
      }
    }
    slideNext(){
      const currentIdx = this.getSelectedItemIndex();
      const nextIdx = (currentIdx + 1) % this.items.length;
      this.slideTo(nextIdx);
    }
    slidePrevious(){
      const currentIdx = this.getSelectedItemIndex();
      const previousIdx = (this.items.length + currentIdx - 1)
        % this.items.length;
      this.slideTo(previousIdx);  
    }
  }

  const slider = new Slider('my-slider');
  slider.slideTo(3);

组件封装

可以按照名字理解组件封装的作用。"封装"就是把许多零散的东西做出一个整体,比如将电线放在电箱内,不仅让使用者便利,而且让维修者思路清晰。

class Slider{
    constructor(id, opts = {images:[], cycle: 3000}){
      this.container = document.getElementById(id);
      this.options = opts;
      this.container.innerHTML = this.render();
      this.items = this.container.querySelectorAll('.slider-list__item, .slider-list__item--selected');
      this.cycle = opts.cycle || 3000;
      this.slideTo(0);
    }
    render(){
      const images = this.options.images;
      const content = images.map(image => `
        <li class="slider-list__item">
          <img src="${image}">
        </li>    
      `.trim());
      
      return `<ul>${content.join('')}</ul>`;
    }
    ...
  }

过程抽象

可以把过程抽象想象成一个锅,锅里面的面条,包括锅本身,它们都是数据,拿开锅盖的动作就是过程,因为它们都是一体的,所以不仅可以把锅和面条抽象成数据,还可以把拿开锅盖的动作也作为抽象的对象,然后进行抽象。

高阶函数

  • 以函数作为参数
  • 以函数作为返回值
  • 常用于作为函数装饰器
  function once(fn) {
    return function(...args) {
      if(fn) {
        const ret = fn.apply(this, args);
        fn = null;
        return ret;
      }
    }
  }

编程范式

  • 命令式
  • 声明式

    命令式比声明式给注重细节,命令式就像买菜,洗菜,切菜,炒菜,而声明式像买菜,炒菜

let list = [1, 2, 3, 4];
  let mapl = [];
  for(let i = 0; i < list.length; i++) {
    mapl.push(list[i] * 2);
  }
  let list = [1, 2, 3, 4];
  const double = x => x * 2;
  list.map(double);

三、总结

我对于好JS代码的理解是不用解释,别人就能明白你的代码。

本文若有不足,欢迎纠正。