参考:https://zhuanlan.zhihu.com/p/28140450
本文绝大部分内容来自上述地址,做为学习资料修改后保存,感谢作者
MDN中 let 的描述可以简单的概括成:
1.let 声明的变量的作用域是块级的;
2.let 不能重复声明已存在的变量;
3.let 有暂时死区,不会被提升。
var 声明的过程:
代码如下:
function fn(){
var x =1
var y =2
}
fn()
执行顺序:
1.进入fn,为fn创建一个环境。
2.找到fn中所有用var声明的变量,在这个环境中创建这些变量
3.变量初始化为undefined
4.执行代码
5.x=1将变量赋值为1,y=2将变量赋值为2
总结:var声明会在代码执行前就创建变量,并将其初始化为undefined(var的创建和初始化被提升了);
function 的声明过程:
1.找到所用用function 声明的变量,在环境中创建这些变量
2.将这些变量初始化并赋值
3.然后执行代码
总结:function声明会在代码执行前就创建、初始化并赋值
Let 声明的过程:
代码:
{
let x = 1
x=2
}
过程:
1.找到所有用let声明的遍历,在环境中创建这些变量
2.开始执行代码(没有初始化)
3.执行 x = 1,将x初始化为1(并不是赋值,如果代码是let x ,就将x初始化为undefined)
4.执行x =2,将x进行赋值
5.如果在let x 以前使用x,由于x没有初始化,所以会报错;
总结:let只是创建变量这个过程被提升了,但是初始化没有提升;而var的创建和初始化都提升了;
总结:
1:let 的创建过程被提升了,但是初始化。
2:var 的创建和初始化都被提升了。
3:function 的创建、初始化和赋值都被提升了。
4:const 和let的区别是,const只有创建和初始化,没有赋值。