ES6学习总结之let 和 const 命令

前言

在说let和const命令之前,我先讲述一下JavaScript中的变量声明命令var,在ES6之前,变量的声明几乎都是使用var命令,通过var声明的变量所在的作用域是全局作用域或者函数作用域,变量一旦被声明,在其所在作用域下的任何位置都能被访问而不会被报错,同时,var所声明的变量会被提升到作用域最前面,所以可以在声明之前对变量进行访问,只不过此时会返回undefined。而ES6新增了声明变量命令let和const,也使得JavaScript支持块级作用域。

下面详细讲一下let和const命令所具有的特点。

let命令

let命令的用法类似var,但是其声明的变量只在其所在的块级作用域有效,也就是说出了该变量所在的块级作用域,无法对let声明的变量进行访问。

除此之外,let声明的变量不存在变量的提升,上面说到,var声明的变量会被提升到作用域前面,使得变量在使用之前可以被使用,而let声明的变量却不具备这一点,若在声明之前使用则会报错,所以必须在let声明之后变量才可以使用

let不允许在相同的块级作用域下重复声明一个变量,否则就会报错。

因此,也不允许在函数内部再次声明参数,否则会报错。

但是如果在函数内部的块级作用域下声明参数就不会报错。

let命令很适合使用在for循环的计数器中

可以知道,变量i只在循环体中有效,否则就会报错。

我们再探索一下for循环中分别使用var和let来声明计数器会有什么不同之处。

可以看到上面代码最后输出10,上面说过var声明的变量在全局作用域或者函数作用域下的任何位置都可以被访问到。也就是说在for循环所在的作用域范围内在只有一个 i 变量,所以每次循环中console.log(i)的 i 都是指向同一个,所以 i 变化都会影响数组a中每一个console.log(i)的输出结果,所以不管是哪一次循环中的console.log(i),最后输出的结果 i 都是最后一轮循环之后的 i ,也就是10。

接下来我们使用let来声明循环计数器。

可以看到最后输出的是不同结果,因为let声明的变量只在当前所在的块级作用域内有效,所以当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是7。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。

除此之外,其实for循环还有一个特别的地方,那就是循环变量的那一部分是一个父作用域,而循环体内部是一个单独的子作用域。

abc输出了3次,可以看出console.log()中的i变量和循环变量i不在同一个作用域内。

const命令

const命令与let也有相似之处,都是变量只在所在的块级作用域内有效,但const一旦声明变量,常量的值就不能被再次改变,否则会报错

所以在声明时变量就必须被初始化,不能留到以后赋值。

同时,const声明的变量与let一样,不存在变量提升,所以必须在声明之后才能使用,否则会报错。

除此之外,在相同块级作用域下,const声明的常量,也与let一样不可重复声明。

总结

相同点:let与const都在块级作用域下有效,不存在变量提升,在变量声明后才能使用,并且在相同块级作用域下不能重复声明变量。

不同点:let可以先声明后赋值,而const必须在声明的同时初始化变量,并且const声明的是常量,一旦声明,常量的值就不可以改变。

参考来源:let 和 const 命令(阮一峰)

发布了39 篇原创文章 · 获赞 30 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/HU_YEWEN/article/details/99590427