ES6+ 内容

78 阅读4分钟

ES6中新增了俩个声明变量的函数

let与const

相对于前面的var来说 let月const有什么区别呢
1. 他们之中最主要的区别就是作用的不同 
    * var的作用域是函数作用域与全局作用域
    * let/const的作用域是块作用域与函数作用域
2. var会对变量进行提升,只是会对声明的变量进行提升,赋的值不会进行提升
let与const的区别
  • let
    1. 用来声明变量
    2. 可以不写初始值
    3. 可以重新修改变量
  • const
    1. 用来声明常量
    2. 需要初始值
    3. 无法重新修改声明的值

箭头函数

  • 箭头函数是ES6 新增的一个对以前普通函数的一个写法优化
  • 箭头函数专属的写法优化
      1. 箭头函数的形参如果只有一个, 并且没有默认值的时候, 可以省略形参的小括号不写 => 如果 函数的形参有多个, 或者说有一个形参并且有默认值, 或者 没有形参, 这些情况都必须书写 形参的小括号
      1. 如果 函数的调用要执行的代码只有 1 行, 那么可以省略 大括号, 并且默认自带 return 效果
// 1. 函数只有一个形参
       const fn1 = a => { }
       // 2. 函数只有一个形参 但是具有默认值
       const fn2 = (a = 100) => { }
       // 3. 函数没有形参
       const fn3 = () => { }
       // 4. 函数有多个形参
       const fn4 = (a, b, c, d) => { }

       // 5. 函数没有返回值, 并且内部代码有多行
       const fn5 = () => {
           console.log(1)
           console.log(1)
           console.log(1)
       }
       // 6. 函数不需要返回值, 但是内部代码有多行
       const fn6 = () => console.log(1)
       // 7. 当函数只需要返回一个对象的时候
        const fn7 = () => {
            return { a: 1, b: 2 }
        }
       const fn7 = () => ({ a: 1, b: 2 })
       // console.log(fn7())

       // 8. 函数内部只需要返回一个数组
       const fn8 = () => [1, 2, 3]
       // console.log(fn8())

       // 9. 函数内部返回一个新的箭头函数
        const fn9 = () => {
            return function () {}
            return () => {}
        }
       const fn9 = () => () => {}
       console.log(fn9())  
    

解构赋值

  • ES6 数组的结构赋值 (只能用于数组)

  • 要求:

    • 声明变量的时候 需要使用 [ ] 包裹
    • [] 内部的变量名 只要符合命名规范与规则就行了
    • = 赋值号右边必须跟一个 数组
  • 作用: 会按照数组内部元素的排列顺序, 依次赋值给 = 左边 的变量

    var arr = ['元素1', '元素2', '元素3']
    let [a, b, c] = arr
  • 解构的参数多了,会给多出来的undefined

  • 如果是被结构的数组内容多,就只会依次赋值省略多出来的

  • 对象的解构赋值

    • 对象的解构赋值与数组的很相似,但是对象在解构的时候必须是属性名要对应

展开运算符

  • 在 函数的形参 前 书写一个 ...
  • 能够将 所有的实参的内容, 存放在这个形参中, 并且是以数组的形式存储的
   // 优化实参的传递
         var arr = [1, 2, 3]
         const fn = (a, b, c) => {
             console.log(a, b, c)
         }
         fn(arr[0], arr[1], arr[2])  // 1 2 3
         fn(...arr)  // 1 2 3
        
       const fn = (...myEl) => {
            console.log(myEl)
        }

        const fn = (...myEl, myEl2) => { // 语法报错
            console.log(myEl)
        }

        const fn = (fb, ...myEl) => {
            /**
             *  形参 fb 按照顺序接收 第一个 实参传递的值, 如果没有实参那么他就是一个 undefined
      
             *  从 第一个 实参后续的所有实参, 全都放在了 第二个 形参的数组中
            */
            console.log(fb, myEl)
        }

        fn()
        fn(1)
        fn(1, 'QF001')
        fn(1, 'QF001', true)
        fn(1, 'QF001', true, undefined)
     

函数的 this 指向

  • 函数内部的 this 指向和函数的书写没有任何关系

  • 而是和函数的调用有关系

  • 注意: 箭头函数内部没有 this, 他的 this 是从你使用的哪一行开始

  • 向上一直寻找, 直到找到一个 this

     const fn = () => {
            console.log(this)
        }
            fn() //window

         var obj = {
             name: '我是 obj 对象',
             objFn: fn
         }
         obj.objFn() //window

         var obj = {
             name: '我是 obj 对象',
             objFn: () => {
                 console.log(this)
             }
         }
         obj.objFn() //window

     const fn1 = () => {
            console.log(this)
        }
        function fn2() {
            fn1()
        }
        function fn3() {
            // console.log(this)   // obj

            const f = () => {
                console.log(this)
            }
            f()
        }

        var obj = {
            objFn1: fn1,
            objFn2: fn2,
            objFn3: fn3
        }

        obj.objFn1()    // window
        obj.objFn2()    // window
        obj.objFn3()    // obj

修改函数内部this指向

  • call
    • 函数名.call(需要指向的值,参数一,参数二,参数三,...)
    • 可以修改函数的this的指向,并向参数传递进去,并执行函数
  • apply
    • 函数名.apply(需要指向的值,[参数一,参数二,参数三,...])
    • 可以修改函数的this的指向,并向参数传递进去,并执行函数
  • bind
    • 函数名.bind(需要指向的值,参数一,参数二,参数三,...)
    • 作用: 修改函数内部的this指向, 并将参数传递进去, 然后将处理好的函数 返回
    • 注意: 这个方法不会立即执行函数, 而是会将修改好this的一个函数返回出来, 需要使用的话, 可以自己调用
    function fn(a, b, c) {
           console.log(a, b, c, this)
       }

       const obj = {
           name: '我是 obj'
       }

      /fn(100, 200, 300)   // 100, 200, 300, window

       // 需求: 让 fn 函数 内部的 this 指向 obj 对象


       // 解决方案1: call
        fn.call(obj, 10, 20, 30)    // 10, 20, 30, obj

       // 解决方案2: apply
        fn.apply(obj, [1, 2, 3])    // 1, 2, 3, obj

       // 解决方案3: bind
       const newFn = fn.bind(obj, 'bind_1', 'bind_2', 'bind_3')
           newFn();  // bind_1   bind_2  bind_3  obj
           
           此时打印newFn 得到一个函数,这个函数实际上是一个新函数,他的this指向的是obj
           function fn(a, b, c) {
               console.log(a, b, c, this)
           }
       // console.log(newFn)  //f