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关键词声明的变量不具备变量提升的特效(第二步提到了的),存在暂时性的死区,只能在声明的位置后使用,

浙公网安备 33010602011771号