JS中没有块级作用域,只有全局作用域和函数作用域;
let定义的变量让其产生了块级作用域。
Var没有块级作用域
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2cbff143459646304e1640fcc788db0c.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8bbba69cfcfc8e0d6e9d7a5dbfbef02b.png)
Let有块级作用域
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/04c72844a8b1d58a431741e68c670ac8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7d7657d87189db1a07631d86bd6f0b5d.png)
直接报错,因为离开了块级,变量不存在
Var有变量声明提升
函数声明和变量声明会被解释器“提升”到方法体的最顶部
注意:只有声明会被“提升”,赋值不会被提升
下面这样会直接报错
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/331be56a6eedcbc19dce1715ccf02171.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5bec16c0cacd9396383bac57287d8521.png)
当函数体中有定义变量时,则不会报错,会undefined
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/98b61e5404f3ded460b8d7210c1791ad.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/95b08420d84bd49f1a1d028618ec5dfe.png)
Let无变量声明提升
下面代码会直接报错,所以声明let变量时要放在函数头部
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1648cf3e18c1464be0aaa12f6f411625.png)
![](https://i-blog.csdnimg.cn/blog_migrate/57aab57ae0e7b95d9172237512e604e8.png)
函数声明提升
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6955fc284b887f94090d441478a9ab63.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4444e2e18e42ab52bbc1e37cc6e91702.png)
通过函数声明表达式,这样就不会造成覆盖的问题了。