什么是变量提升?
console.log(a)
var a = 10
上面这段代码不会报错 反而会输出一个undefined。这就是因为变量声明被提升了
等于
var a;
console.log(a)
a = 10
上面是在全局的作用域中 那在函数作用域也会出现
function fn() {
console.log(a) // undefined
var a = 10
}
为什么会有变量提升呢?
变量提升原理
在短暂的编译阶段,JS会搜索出所有的变量声明,并且提前把声明生效,至于剩下的句子就需要等到执行阶段,执行到某一句的时候才会生效 这个就是变提升的机制。
被禁用的变量提升
let 和 const区别与var的一个重要特征就是 不存在变量提升
console.log(a)
let a = 10; // 报错 a is not deefined
块级作用域
块作用域是伴随着ES6而生的一个概念,我们把一对花括号括起来的代码叫做代码块 也就是 块作用域
{
let a = 10
console.log(a)
}
暂时性死区
在ES6中明确规定:如果区块中有 let 和 const命令,这个区块对命令声明的变量,从一开始就形成了封闭的作用域 如果在声明前去使用这些变量,那么就会报错 ,这一段会报错的危险区域我们叫做 暂时性死区