| 特性 | var | let | const |
|---|---|---|---|
| 作用域 | 函数作用域或全局作用域 | 块级作用域 | 块级作用域 |
| 变量提升 | 完全提升(声明和赋值) | 部分提升(只提升声明,未赋值) | 部分提升(只提升声明,未赋值) |
| 重复声明 | 可以在同一作用域重复声明 | 不可以在同一作用域重复声明 | 不可以在同一作用域重复声明 |
| 重新赋值 | 可以重新赋值 | 可以重新赋值 | 不可以重新赋值(但对象属性可以修改) |
变量提升:在底部声明或者赋值的变量,会自动移动到顶部,供下面使用这个变量,但值为undefined
代码输出var count = 2; a(){ return count + 1; } fn1(){ var count =1; a(); }
输出为 3,3 原因是:fn1函数调用 a 函数的时候,此时的 count 先找函数内部的作用域,找不到再找父作用域,此时的父作用域是在定义时确定的,而不是执行时,因此,此时的父作用域的 count 为 2,而不是重复声明 var 的 1