1、const、let和var

在es6新特特性这,let和const可以达到局部作用域的效果。

1.1 var

  1. var a = 4
  2. function say () {
  3. console.log(a)
  4. var a
  5. }
  6. say()

大家在网上听的最多的就是var会进行变量提升,事实也是如此。上面例子中,函数外部声明变量a赋值为4。当调用函数时,内部的变量a会提到log前提前声明,并且默认赋值为undefined。然后才log。如下图

  1. var a = 4
  2. function say () {
  3. var a = undefined
  4. console.log(a)
  5. }
  6. say()

所以你们看到的结果为undifind,同理下面例子也是如此

  1. console.log(b)
  2. var b = 4
  3. console.log(b)

上面例子会先变量声明赋值为undefined,然后在将4赋值给变量b

  1. var b = undefined
  2. console.log(b)
  3. b = 4
  4. console.log(b)

1.2 let/const

在let中,很多人在面试中都会回答到。他与var最大的区别是不会变量提升,其实不然。可以看下面这个例子

  1. let a = 1
  2. function say () {
  3. console.log(a)
  4. let a = 2
  5. }
  6. say()

按照大多数人的了解,这个结果不会变量提升,所以应该输入外部的1才对。但是结果却是报错,下面看看分析。

  1. let a = 1
  2. function say () {
  3. let a
  4. console.log(a)
  5. a = 2
  6. }

在调用say函数的时候,他发现在局部作用域(函数内部)里有一个变量声明,它依旧会将其变量提升,只是这次与var的区别不太一样,var在提升的同时,他会进行一个赋值为undefined,但是let只是单纯的变量提升。所以你会发现这个是报错的。

const 也是一样的道理,只是在const中不能对变量进行更改。

2、TDZ时间死区

其实刚刚我们已经接触到了时间死区,只是你没有发现。

  1. let a = 520
  2. function say () {
  3. // 时间死区开始
  4. console.log(a)
  5. // 时间死区结束
  6. let a = 520
  7. }

在上面例子中,因为我们下方使用let对a进行变量声明后,造成的变量提升,导致我们无法对a进行修改。这个位置就是我们说的时间死区。