ES6 第二章Let和Const命令
一.Let
-
基本用法
就是是一个变量声明类似于var,但是所声明的变量,只在let命令所在的代码块内有效。常用于for循环的循环变量
for中声明循环变量i类似于for(let i=0;i<n;i++){…} for循环有两个作用域,声明循环变量的是父作用域,代码部分是子作用域。 也就是说I在每次循环的当前次数才有意义循环重新开始一次都会重新初始化但是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
-
不存在变量提升
简单的说也就是 用Var声明的变量,在声明之前使用值是undefined但是用let声明的变量在声明前使用就直接抛错。
-
暂时性死区
暂时性死区就是说 在使用let对变量进行定义之前不能使用这个变量。在let所在的代码块中,凡是在let之前的区域都叫变量的暂时性死区。逻辑上感觉也是这样,都没有定义怎末就可以用了呢。
-
不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。指的是同级作用域内不能再次声明。
function func(arg) { { let arg; } }
这样是可以的。 -
块级作用域
简单的说块级作用域也就是一个{} 之间。就属于一个块。在这个块内定义的东西外面的用不了。
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函 数声明语句的行为类似于let,在块级作用域之外不可引用。例如:function f() { console.log('I am outside!'); } (function () { if (false) { // 重复声明一次函数f function f() { console.log('I am inside!'); } } f(); }());
在ES5中会输出”I am inside!“,因为ES5会把函数定义提前到开头所以前一个被覆盖,但是ES6在函数内部声明函数类似于会给函数加上let定义只在当前块内有效。为了减轻因此产生的不兼容问题,ES6 在附录 B里面规定,浏览器的实现可以不遵守上面的规定,有自己的行为方式。
允许在块级作用域内声明函数。
函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
同时,函数声明还会提升到所在的块级作用域的头部。
所以最好用函数表达式避免兼容问题。
二.const命令
- 基本用法
const声明一个只读的常量。一旦声明,常量的值就不能改变。即const一旦声明变量,就必须立即初始化,不能留到以后赋值。与let类似同样是存在作用域,暂时性死区,不能重复声明。与let相比就多了一个定义即赋值而且不能改变。
- 本质
cosnt的本质是变量指向的那个内存地址所保存的数据不得改动。但是当变量是数组和对象就不一样了。因为变量指向的只是一个首地址那个位置的值不能改变但是其他的值可以改变。就好像面向过程的常量指针一样,但是指针指向的东西不能变。
- 顶层对象的属性
var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方 面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是把顶层对象和全局变量区分开来。
- globalThis 对象
取顶层对象用的。而且在所有环境下都适用。