- var 变量总是提升到当前函数作用域的顶端
- let,const 为块级作用域,
变量声明提升
var与let作用域规则不一样
- var: 变量总是提升到当前函数作用域的顶端
- let: 当前块的作用域
1 | function varTest() { |
let 可以用来创建类的私有属性
1 | var Thing; |
let 不能重复声明
1 | if (x) { |
let, const 存在暂存死区
- var: 变量提升,会被移动到函数顶端,被初始化为undefined,存在函数堆栈内
- let: 不会变量提升,直至显示赋值才会被加入函数执行堆栈内,在块级作用域开始时,会被放到
暂存死区, 无法被引用
1 | // prints out 'undefined' |
习题解释
1 |
|
1 | // code02 |
- code01: var 会被提升到函数的顶端, 因此处于同一块级作用域,所以抛异常
SyntaxError - code02: ++ 修改的是块级作用域内的 x 的值,所以 外面 x 的值不变
函数声明提升
普通提升
1 | hoisted(); // "foo" |
1 | var hoisted; |
相同点:
- var, function 都会被提升
不同点:
- var 提升在 function 之前
- var 为函数级提升,function 为块级提升
有条件提升
1 | // code01 |
1 | // code02 |
- code01: 变量提升,函数未提升,执行undefind(),所以报错:TypeError
- code02: foo 没有被声明,没有找到foo,所以报错: ReferenceError