特性varletconst
作用域函数作用域或全局作用域块级作用域块级作用域
变量提升完全提升(声明和赋值)部分提升(只提升声明,未赋值)部分提升(只提升声明,未赋值)
重复声明可以在同一作用域重复声明不可以在同一作用域重复声明不可以在同一作用域重复声明
重新赋值可以重新赋值可以重新赋值不可以重新赋值(但对象属性可以修改)

变量提升:在底部声明或者赋值的变量,会自动移动到顶部,供下面使用这个变量,但值为undefined

代码输出var count = 2; a(){ return count + 1; } fn1(){ var count =1; a(); }

输出为 3,3 原因是:fn1函数调用 a 函数的时候,此时的 count 先找函数内部的作用域,找不到再找父作用域,此时的父作用域是在定义时确定的,而不是执行时,因此,此时的父作用域的 count 为 2,而不是重复声明 var 的 1

reference