ES6基础

JS为什么需要块级作用域(ES6引入let关键字的原因)?

场景一:内层变量可能覆盖外层变量

变量提升导致内层变量覆盖了外层变量
    var tmp = new Date();
    function f() {
      console.log(tmp);
      if (false) {
        var tmp = 'hello world';
      }
    }
    f(); // undefined

场景二:用来计数的循环变量泄露为全局变量

    var s = 'hello';
    for (var i = 0; i < s.length; i++) {
      console.log(s[i]);
    }
    console.log(i); // 5

不再需要IIFE(立即调用函数表达式)

    (function () {
        statements
    })();

块级作用域存在暂时性死区,且不存在变量提升

关于顶层对象

  • ES6声明变量的六种方式:var function let const import class
  • var 和function兼容以前JS版本,全局变量依旧为顶层对象属性
  • let const class全局变量不属于顶层对象
  • ES6开始,全局变量和顶层对象属性逐渐脱离

关于箭头函数

  • 函数体内的this对象指向函数定义时候的对象,ES5中this指向使用时候的对象
  • 箭头函数不可以作为构造函数,所以不能使用new
  • 不可以使用arguments对象,该对象在函数体内不存在,若要使用,可以使用rest参数替代
  • 不可以使用yield命令

运行时加载和编译时加载

  • 运行时编译:AMD/CommonJS模式下,获取一个模块内某个方法,必须全部加载整个模块对象后,才可以获取到,依赖关系只能在运行时获取,此种类型称为运行时加载
  • 编译时加载:ES6中的模块功能,趋向于静态化,通过export和import方法,使得模块加载在编译时候就能完成,需要哪个加载哪个,因此加载效率比AMD或CommonJS要高。由于ES6的模块化是在编译时候进行,因此可以进行代码静态分析,引入宏或类型校验等。
// CommonJS模块
let { stat, exists, readFile } = require('fs');
// 等同于
let _fs = require('fs');
let stat = _fs.stat;
let exists = _fs.exists;
let readfile = _fs.readfile;
CommonJS先加载整个模块对象,然后从对象中获取所需方法,此过程只能在运行时加载

import { stat, exists, readFile } from 'fs';
ES6中单独加载所需模块
  • 宏:将一些命令组织到一起作为一个单独命令完成一个特定的任务。

ES6模块化的好处:

  • 不再需要UMD(通用模块规范)格式整合AMD和CommonJS了,服务器和浏览器统一使用ES6模块化加载方式
  • 浏览器新的API就可以用模块化格式提供,而非做成全局变量或者navigator的属性
  • 不再需要命名空间,eg:Math等,
posted @ 2019-10-31 22:24  南华秋水  阅读(129)  评论(0编辑  收藏  举报