区别
- var存在变量提升,可以在在声明之前使用。let、const存在暂时性死区,不能在声明之前使用。
- 函数提升优于变量提升。函数提升会把整个函数挪到作用域顶部,变量提升只会把变量声明挪到作用域顶部。
var a = 10;
var a;
console.log(a);// 10
// 上述代码相当于以下代码,变量提升会把所有变量声明提到作用域顶部,然后再进行变量赋值
var a;
var a;
a = 10;
- var在全局作用域下声明变量,会导致变量挂载到window上,let、const不会。
- let和const作用基本一致,但是const声明的变量不允许再次赋值。const声明的对象只是保证该对象的地址不能改变,但是对象的值是可以改变的。
// 保证对象不被改变
let obj = Object.freeze({ a: 1 });
obj.a = 2;
console.log(obj.a); // 1
变量提升
变量提升存在的原因是解决函数间相互调用的问题,如果没有变量提升,则不可能实现下述问题。因为不可能存在f1在f2的前面,同时f2又在f1前面的情况。
function f1(){
f2();
}
funciton f2(){
f1();
}