每天学点ES6-let和const
今天学习的比较简单,主要学习ES6
的let
和const
。
我们知道在ES6
之前,是没有块级作用域这一说的,例如:
1 | function getValue(condition) { |
你可能会觉得在else
里面无法访问到value
变量,其实在js
内部会造成变量提升,这意味着我们可以在else
里面访问到value
变量,只是它未初始化,所以其变量值为undefined
。实际解析时代码可能像这样:
1 | function getValue(condition) { |
let
和const
为我们带来了块级作用域
,这意味着它只能在代码块内才能访问到,出了代码块就会抛出异常了,还有一点重要的是,let
和const
不会造成变量提升
。
let
let
定义变量时和var
有两个区别:块级作用域、不会变量提升和不能定义在块中已有标识符同名的变量。
我们用let
来重新定义上面的函数:
1 | function getValue(condition) { |
当用let
定义value
时,我们只能在if
里面才能访问到value
了,value
变量也不会变量提升,从而我们在else
里面不能访问到value
。
let
最常用的场景应该是for
循环了:
1 | for (let i = 0; i < len; i++) { |
块级作用域
块级作用域就不用多说,就是用let
定义的变量只在定义它的块中有效,出了这个块你就不能访问到它了。
变量提升
变量提升应该是在面试的时候会经常考到,例如:
1 | function test () { |
我们用let
重新定义上面的test()
函数:
1 | function test () { |
此时浏览器就会抱怨了,在let
定义前是无法访问到我们的变量的。
同名变量
用var
定义变量时,我们可以多次对它进行定义,例如:
1 | var a = 1; |
这样的代码是不会报错的,在let
定义的相同块
中定义同名变量时就会报错了,例如:
1 | let a = 1; |
要注意的是要与let
定义时在相同的块中,下面的代码是不会出错的:
1 | var a = 1; |
const
const
除了具有let
的块级作用域和不会变量提升外,还有就是它定义的是常量,在用const
定义变量后,我们就不能修改它了,对变量的修改会默默的失败(在iojs
中会抛出异常,在Chrome下会默默的失败)。例如:
1 | const PI = 3.1415; |