es6 语法 let 的特性

基本语法

let声明的变量 只能它所在的代码块内有效 无法外部调用

 

 

let可以在for循环中使用  受let影响  i 只在for循环的作用域内有效   在外部使用会报错

 

 

let 不存在变量提升   它所声明的变量一定要在语法声明后使用

 

 

暂时性死区

只要块级作用域内存在let 这个命令  它就会绑定这个区域  不在受外面的影响

在下面代码中 存在全局变量tmp  但是在块作用域  let又声明了一个相同的变量  导致let绑定了这个作用域  所以在let声明前直接使用 导致报错

 

 

 

es6 明确规定 如果在快级作用域中使用let和const  这个区块会对面这些命令声明的变量 形成封闭作用域   必须先声明在使用 否则会报错

在代码块中  使用let声明变量之前  该变量都是不可用的 这种情况就是暂时性死区

 

下面的代码中  在let 命令声明变量tmp之前   都属于变量tmp 的死区

 

 

有些死区会比较隐藏 

在下面代码中 参数x=y   此时y 还没声明 属于死区   导致调用时报错

 

 

 

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

let不能在函数内部重新声明参数  除非它们不在一个作用域内  不会相互影响

 

 

 

为什么使用块级作用域

在es5中   只有全局作用域和函数作用域  会导致很多问题 带来不合理的场景

第一种情况 ; 内层变量会覆盖外层变量

 

 

 

第二种情况:for 循环中的 i 会泄漏成全局变量

 

 

es6的块级作用域

let为函数新增了块级作用域   

下面的代码中存在两个n    输出是5  表示外层代码块 不会受内层代码块的影响

 

es6允许作用域的任意嵌套   每一个大括号就是一个单独的作用域   

 

 

内层作用域可以定义外层作用域的同名变量

 

 块级作用域与函数声明

 在es5中规定 函数只能在块级作用域和顶级作用域中声明  不能在块级作用域声明

 es6 引入了块级作用域  允许在块级作用域中声明函数  es6规定  块级作用域声明的函数语句类似let  不可以在外面引用

 

 

   上面代码在es5浏览器执行 函数 f 会提升到函数头部   打印出结果 I am inside!   在es6浏览器中会报错

 

   为了避免es6 和es5 在浏览器执行时的冲突问题  es6允许以下行为  只能es6浏览器有效

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

   2.  函数声明类似var 会提升到函数作用域和全局作用域的头部

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

  

   根据以上3个规则 浏览器的es6环境中 块级作用域声明的函数 行为类似var声明的变量   以下代码在es6浏览器执行报错

   

 

   由于环境导致的差异 应避免在块级作用域内声明函数   如果确实需要 应写成函数表达式 而不是函数声明语句

    

 

 

 

 

  

posted @ 2020-11-18 10:01  随心的笔记  阅读(302)  评论(0)    收藏  举报