ES6: 变量说

前言

  自从ES6新增后给前端的js代码书写带来很大的变化或者便利性。其中对于变量的定义var、let、const简单介绍一下。

作用域

  先了解一下作用域的概念,JavaScript之前有两种作用域:全局作用域和函数作用域,之后ES6增加了块级作用域。同时引入了let和const类型变量。

  • 全局作用域全局作用域贯穿整个javascript文档,在所有函数声明或者大括号之外定义的变量,都在全局作用域里。一旦你声明了一个全局变量,那么你在任何地方都可以使用它,包括函数内部。
  • 函数作用域你在函数里定义一个变量时,它在函数内任何地方都可以使用。在函数之外,你就无法访问它了。
  • 块级作用域你在使用大括号(if for do-while都有大括号,你懂)时,声明了一个const或者let的变量时,你就只能在大括号内部使用这一变量。

  函数作用域和块级作用域,又统称局部作用域,一般只在固定的代码片段内可访问到,而其外部是无法访问的,它分为函数作用域和块级作用域

变量特性

1. var类型

  ① 函数作用域,可以跨块访问,不可跨函数访问;

  ② 可重复定义和修改;

  ③ 支持变量提升。

2. let变量

  ① 块级作用域,不可以跨块访问,更不能跨函数访问;

  ② 不可以重复定义,但可以修改;

  ③ 不支持变量提升

3. const常量

  注意,const是常量,故名思议,不可改变的值

  ① 块级作用域,不可以跨块和跨函数访问;

  ② 必须进行初始化,不可以重复定义,也不能修改(对象的属性除外);

  ③ 不支持提升

 const单独定义变量是不能再次修改的,但是如果定义一个常量对象,其中的属性可以修改。

  

  同理,只是属性可以修改,但是常量对象不可以整体修改。如:

  

变量提升

  上面提到了三个类型变量都涉及变量提升,那变量提升究竟是什么呢? 找出关键,就是提升! 什么东西提升?提升后的结果又是什么? 下面我们一起看看下

  提升:将当前作用域的所有变量的声明提升到程序的顶部。

     js会将变量的声明提升到js顶部执行,在使用和赋值前面。我们看下例子

  

  输出undefined。javascript并不是严格的自上而下执行的语言。上面实际运行顺序如下:

  对于js来说,其实var a = 2是分为两步的。

为什么会有变量提升?

  js和其他语言一样,都要经历编译和执行阶段。而js在编译阶段的时候,会搜集所有的变量声明并且提前声明变量,而其他的语句都不会改变他们的顺序,因此,在编译阶段的时候,第一步就已经执行了,而第二步则是在执行阶段执行到该语句的时候才执行。

 

我们再来看下这个例子:

  

  函数声明高于一切,毕竟函数是js的第一公民

const 和 let 类型变量不存在变量提升,let和const关键词声明的变量不具备变量提升的特效(第二步提到了的),存在暂时性的死区,只能在声明的位置后使用,

 

posted @ 2019-07-05 15:24  王大军  阅读(157)  评论(0)    收藏  举报