1.变量提升
console.log(num) // undefined
var num = 1
输出 undefined,这是因为函数内部的变量声明会被提升。
1-1 变量提升的原理
- js 也是有编译阶段的,其不会早早地完成编译阶段,而是一边编译一边执行。
- 在短暂地编译阶段,js引擎会收集所有的变量声明,并且提前让声明生效。
1-2 被禁用的变量提升
let、const 区别于 var 的一个重要特征——它们不存在变量提升。
console.log(num)
let num = 1 // Uncaught ReferenceError: num is not defined
2.暂时性死区
2-1 let 关键字 与 var 关键字
- 用 let 、const 声明变量时,变量会绑定到块级作用域上。
- 用 var 声明变量时,var 是感知不到块级作用域的。
{
var name = 'wayliu'
let age = 18
console.log(name) // 'wayliu'
console.log(age) // 18
}
console.log(name) // 'wayliu'
console.log(age) // 报错
暂时性死区:
如果区块中存在 let 和 const 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。如果我们尝试在声明前去使用这类变量,就会报错。
2-2 const 关键字
- const 声明的变量,必须在声明同时被初始化。
const a // 报错
- const 声明的变量,赋值过后不可以再更改。
const me = 'wayliu'
me = 'abc' // 报错