01ES6学习——let和var的区别
前言
在 es6 新增 let 命令之前,我们都是使用 var 来定义我们的变量的,接下来让我们来看看 let 和 var 在定义变量的时候有什么不同之处吧!
1.作用域不同
1.1我们在 let 命令出现之前,js 的作用域只有函数作用域和全局作用域
(1)使用 var 来定义变量:
(2)使用 let 来定义变量
从上面的两张图我们可以看出 let 命令定义的变量有了块级作用域的概念,即在花括号的外部我们无法获取花括号内部由 let 定义的变量。
(1)var 定义的变量类似于全局变量;
(2) let 定义的变量类似于局部变量。1.2 let 命令 很适合用来定义 for 循环的计数器
for 循环有一个特别之处:
(1)设置循环变量的那一部分是一个父作用域
(2)循环体内部是一个单独的子作用域
由上图输出的三次’abc’ 可以看出,函数内部的变量 i 和循环变量 i 不在同一个作用域,而是各自有单独的作用域。1.3javascript 语言的特殊之处就在于:
(1)函数内部可以直接读取全局变量
(2)函数外部无法读取函数内部的局部变量
2.变量提升问题
变量提升现象:即变量可以在声明之前使用,值为 undefined 。
(1)使用 var 的情况:
(2)使用 let 的情况
总结:
(1)使用 var 来定义的变量会发生变量提升,即脚本开始运行的时候,i 就已经存在了,但是还没有值,所以输出了 undefined
(2)使用 let 来定义的变量不会发生变量提升。则在声明它之前,变量是不存在的,这时如果用到他,就会抛出错误。
3.暂时性死区问题
暂时性死区:在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。
只要块级作用域内存在 let 命令声明的变量,则它所声明的变量已经 ”绑定“ 了这个区域了,不再受外部的影响
如果一个变量根本没有被声明,typeof 不会报错,而是输出undefined。在没有 let 命令之前是一个百分百安全的操作。
在有了 let 命令来定义变量之后,typeof不再是一个百分百安全的操作了
4.重复声明问题
4.1.1 let 不允许在相同作用域内重复声明同一个变量
4.1.2 let 不允许在函数内部重新声明参数
4.2.1 var 允许在相同作用域内重复声明同一个变量
4.2.1 var 允许在函数内部重新声明参数