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浏览器执行报错
由于环境导致的差异 应避免在块级作用域内声明函数 如果确实需要 应写成函数表达式 而不是函数声明语句