var:变量提升(无论声明在何处,都会被提至其所在作用域的顶部)
let:无变量提升(所在的块内,未到let声明时(即let声明之前),是无法访问该变量的(not defined)),let变量不能重复声明(报错has already been declared)
const:无变量提升,声明一个基本类型的时候为常量,不可修改;声明对象可以修改
<script> var a = 1; function fn() { console.log(a)//undefined a = 2; console.log(a)//2 var a = 3; console.log(a)//3 } /* var声明变量提升到作用域顶部 fn等价于 function fn() { var a; console.log(a)//undefined a = 2; console.log(a) a = 3; console.log(a) } */ function fn2() { //console.log(a)//a is not defined,let声明之前不能使用 let a = 4; //let a = 5;//a has already been declared,在同一个作用域内let不能重复声明如果{let a=5;}就可以,{}内的let声明作用域只在{}有效 console.log(a)//4 } function fn3() { console.log(a)//1 a = 6; } fn(); fn2(); fn3(); console.log(a);//6 </script>
还有以下例子,可以看出函数也存在提升一说:
<script> console.log(fn);//ƒ fn() {} var fn = 1; function fn() {} console.log(fn);//1 /*函数提升,提升到作用域最前 等价于 var fn = undefined; function fn() {} console.log(fn); fn = 1; console.log(fn); */ </script>
具体的提升可以参照:https://zhuanlan.zhihu.com/p/28140450