Es6:新手第一篇 let 和 const

发布时间:2019-08-09 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Es6:新手第一篇 let 和 const脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Es6 letconst

  1. 基本用法

       let a = 10
       console.LOG(a) //10
       // 代码块内执行
       {
           let b = 5
           console.log(b) // 5
       }

    for循环内也是比较试用

       for (let i =0;i<3;i++) {
          console.log(i)  // 0,1,2
       }
    
  2. Es6 let命令只在所在的代码块内使用(块级作用域)
    例1 使用let在函数代码块内使用,ES5中是没有块级作用域的,Es6中的let实际上是为Javascript新增了块级作用域,其实在声明a为10的代码块中则为一个块级作用域,if代码块中也是块级作用域,这就表明了现在有两个块级作用域,重点来了外层代码块不受内层代码块影响,所以a在不同的地方打印出的结果不同

       function f() {
            let a = 10
            if (1===1) {
                let a = 5
                console.log(a) // 5
            }
            console.log(a) // 10
        }
        f()
        

    例2 这个循环的例子let声明了之后,在循环{}代码块内都属于i的块级作用域内,所以在里面怎么打印都会有结果,而在循环外部打印i的结果则是未定义

        for (let i =0;i<3;i++) {
          console.log(i)  // 0,1,2
        }
        console.log(i) // 这样会报错 i is not defined

    然而var则不一样,var也是声明变量,它则在全局范围内有效,让我们来看看
    例1 现在看看VAR定义了变量,在内部可以打印出小于三的每个结果,在代码块外层同样可以得到结果,但是结果和代码块内的不一样,这是因为外层的i是拿到了循环完成之后的结果

       for (var i =0;i<3;i++) {
          console.log(i)  // 0,1,2
        }
        console.log(i) // 3 为什么会得到3,是因为for循环从0开始执行,i++,1然后是2,只执行2次
        

    例2 这里使用var得到的结果全是5,我们来分析一下它的执行步骤,首先执行的函数,声明变量a为10,if代码块,然后再次声明a为5(内层改变外层),打印5,执行出代码块再次打印a时,此时a的值已经被改变5

       function f() {
            var a = 10
            if (1===1) {
                // 在一个代码块的中变量并不会覆盖掉代码块外面的变量
                var a = 5
                console.log(a) // 5
            }
            console.log(a) // 5
        }
        f()
  3. Es6 let 不存在变量提升和暂时性死区
    例1 测试let不存在变量提升

       {
           console.log(foo) // 报错ReferenceError
           let foo = 1
       }

    如果存在变量提升的话上面的代码执行应该

       {
           let a
           console.log(a) //undefined
           a=2
       }

    例2 如果使用let这样操作执行到if会报错,因为let不存在变量提升

       function func() {
           if (typeof let == 'undefined') {
           }
           let val = ''
       }

    我们来看看var的变量提升是什么样的,与let区别在哪里
    例1 var的变量提升(值不提升)

       {
           console.log(foo) // undefined
           var foo = 1
       }

    例2 var变量提升(先判断后声明),这样就不会报错

       function func() {
           if (typeof val == 'undefined') {
           }
           var val = ''
       }

    let 存在的暂时性死区社么为let的死区,只要是在let声明之前则为死区

  4. let 声明在同层代码块内,不可以重复声明
    例1 在一个函数内声明相同的变量名,使用let,这样会报错,如果使用var就会报错

        func()
        function func() {
            let a = 1
            let a = 2
            console.log(a, 'xx')
        }
    例2 现在我们来看看var的执行结果,var 是可以重复声明的
        func()
        function func() {
            var a = 1
            var a = 2
            console.log(a, 'xx') // 2
        }
  5. 作用域和函数声明
    ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明,接下来我们来看看Es5中没有块级作用域,下面的例子执行函数f()打印出的结果为I am inside!因为if内函数会被提升到顶部,然而在es6中理论的结果为I am outside!,但是会报错!

       function f() { console.log('I am outside!'); }
       (function () {
               if (false) {
                   // 重复声明一次函数f
                   function f() { console.log('I am inside!'); }
               }
           f()
       }())

    以上之所以会在浏览器内报错因为在Es6浏览器中块级作用域的声明相当于var声明的变量(变量提升),所以我们尽量写函数表达式而不是函数声明语句,下面这个在Es6浏览器中得到的结果则为I am outside!,内层作用域不影响外层作用域,如果将let 替换成 var 将还是会报错!

       function f() { console.log('I am outside!'); }
       (function () {
               if (false) {
                   // 重复声明一次函数f
                   let f = function f() { console.log('I am inside!'); }
               }
           f()
       }())
       
       例1 创建函数有两种方法一种是表达式,一种是函数声明,下面的去掉foo的代码会正常执行,这就是区别
       function test() {
           foo() // foo not fun
           bar()
           var foo = function () { // 变量提升
               alert("this won't run!");
           }
           function bar() {
               alert("this will run!");
           }
       }
       test()
  6. const声明只读常量,常量一旦声明就不能改变,与变量的区别就在上面

       //const一旦声明变量,就必须立即初始化,不能留到以后赋值。
       const foo
       //const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用
       console.log(a) // 会报错
       const a = 1
       // const声明的常量,也与let一样不可重复声明,以下都会报错
       const b = 1
       const b = 2
       // 正确的声明只需声明一次
       const c = 1
       console.log(c)  //1
      它的本质说白了就是指向内存的数据不得改的,但是还有另一种情况
       const foo = {};
       // 为 foo 添加一个属性,可以成功
       foo.PRop = 123;
       foo.prop = 321;
       console.log(foo.prop); // 321
       
       foo = {} // 就会报错,不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性
      Es6声明变量的6种方法(varfunctiones5)),letconstimportclass
  7. 顶层对象window和global对象(这里可以看看文档就行,最重要的可以多看看this

      浏览器window:Es6中的六种方法声明的变量,使用window都可以拿到,因为顶层对象的属性与全局变量是等价的
      
      global:ES5 的顶层对象,本身也是一个问题,因为它在各种实现里面是不统一的。
       浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window。
       浏览器和 Web Worker 里面,self也指向顶层对象,但是 Node 没有self。
       Node 里面,顶层对象是global,但其他环境都不支持。
      

脚本宝典总结

以上是脚本宝典为你收集整理的Es6:新手第一篇 let 和 const全部内容,希望文章能够帮你解决Es6:新手第一篇 let 和 const所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。