美文网首页
ES6学之初笔记

ES6学之初笔记

作者: 木木呀暮暮 | 来源:发表于2018-10-18 20:02 被阅读0次

    http://es6.ruanyifeng.com/#docs/let(官方文档)

    let命令:

    let命令:声明变量作用域为let命令所在{ }

    上述代码 let声明的a只在{ }内部生效,var声明的 b则是全局变量

    上述代码中let声明的i只在 循环体内部有效;

    用for循环声明函数存放在数组中,a[i]的作用是输出i的值,因为var声明的i是全局变量,全局只有一个i,每循环一次i的值就会加1,console.log(i)中的i指向的是全局变量i;

    在上述代码中for循环设置(let i=0;i<3;i++)的作用域和循环体内部处于不同的作用域,不会发生干扰。


    不存在变量提升:

    var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。

     let命令声明的变量一定要在声明之后使用,否则就会报错。


    暂时性死区

    暂时性死区(temporal dead zone,简称 TDZ):在代码块内部也就是{ }中,它所声明的变量就绑定在这个区域之中,!不受外部影响!,也就是说,在使用let命令声明变量之前,该变量是不可用的

    在上述代码中,代码块中的{  }内部声明一个局部变量tmp,导致局部变量tmp绑定在这个块级作用域中,且不受外部var声明的全局变量tmp的影响,因此声明之前使用了变量,导致出现报错。

    上诉代码中,在let命令声明tmp之前,都属于tmp的死区,

    上述代码由于在let声明x变量之前(x变量的死区中)使用x变量,所以报错

    上述代码中,由于未用let声明undeclared_varible所以不存在该变量的死区,所以不会报错。

    比较隐蔽的死区:

    上述代码中把参数x默认等于另一个参数y,而此时y还未被声明(我认为:x=y ,y=2相当于在默认情况下 letx=y  let y=2;)属于死区。 如果如下图所示代码,就不存在死区,是可以输出的

    另外:下面代码也会报错:

    上面代码之所以会报错也是因为死区,let x=x意思是把x的值赋给(变量未声明时使用该变量,出现“死区”)let声明的x的变量。

    总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。


    不允许重复声明:

    let不允许在相同作用域内,重复声明同一个变量



    块级作用域:

    ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景

    第一种场景,内层变量可能会覆盖外层变量。

    if(false){  }意思是永不执行,也就是在调试代码的时候用用,之所以会输出undefined是因为javaScript 中,函数及变量的声明都将被提升到函数的最顶部,此段代实际执行的代码为

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



    ES6的块级作用域:{ }

    函数的作用域与函数声明:

    ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。

    ES6:

    1.允许在块级作用域内声明函数。

    2.函数声明类似于var,即会提升到全局作用域或函数作用域的头部。

    3.同时,函数声明还会提升到所在的块级作用域的头部。

    注意,上面三条规则只对 ES6 的浏览器实现有效,其他环境的实现不用遵守,还是将块级作用域的函数声明当作let处理。

    考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。

    if判断如果不写{ } 的话 意为 :条件判断成功之后只执行if判断的下一条语句。

    相关文章

      网友评论

          本文标题:ES6学之初笔记

          本文链接:https://www.haomeiwen.com/subject/zkrjzftx.html