关于javascript:关于Es6-Let和const的认识

42次阅读

共计 1268 个字符,预计需要花费 4 分钟才能阅读完成。

一:ES6 概念

ES6 的第一个版本,在 2015 年 6 月公布了,正式名称就是《ECMAScript 2015 规范》(简称 ES2015)。ES6 既是一个历史名词,也是一个泛指,含意是 5.1 版当前的 JavaScript 的下一代规范,涵盖了 ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年公布的正式版本的语言规范。

转码器 Babel

Babel 是一个宽泛应用的 ES6 转码器,能够将 ES6 代码转为 ES5 代码,从而在现有环境执行。
Babel 的配置文件是.babelrc,寄存在我的项目的根目录下。应用 Babel 的第一步,就是配置这个文件。

二:let

ES6 新增了 let 命令,用来申明变量。它的用法相似于 var,然而所申明的变量,只在 let 命令所在的代码块内无效。

{
  let a = 10;
  var b = 1;
}

a // ReferenceError: a is not defined.
b // 1
不容许反复申明
let 不容许在雷同作用域内,反复申明同一个变量。

块级作用域概念

{} 内为块级作用域。

块级作用域与函数申明:

ES5 规定,函数只能在顶层作用域和函数作用域之中申明,不能在块级作用域申明。
ES6 规定,块级作用域之中,函数申明语句的行为相似于 let,在块级作用域之外不可援用。思考到环境导致的行为差别太大,应该防止在块级作用域内申明函数。如果的确须要,也应该写成函数表达式,而不是函数申明语句。

不存在变量晋升

let 命令所申明的变量肯定要在申明后应用,否则报错。

// var 的状况
console.log(foo); // 输入 undefined
var foo = 2;

// let 的状况
console.log(bar); // 报错 ReferenceError
let bar = 2;

暂时性死区

只有块级作用域内存在 let 命令,它所申明的变量就“绑定”(binding)这个区域,不再受内部的影响。

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

在代码块内,应用 let 命令申明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

三:const

const 申明一个只读的常量。一旦申明,常量的值就不能扭转。

只在申明所在的块级作用域内无效。
const 命令申明的常量也是不晋升,同样存在暂时性死区,只能在申明的地位前面应用。

const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.

const 原理解析

const 实际上保障的,并不是变量的值不得改变,而是变量指向的那个内存地址不得改变。对于简略类型的数据(数值、字符串、布尔值),值就保留在变量指向的那个内存地址,因而等同于常量。但对于复合类型的数据(次要是对象和数组),变量指向的内存地址,保留的只是一个指针,const 只能保障这个指针是固定的,至于它指向的数据结构是不是可变的,就齐全不能管制了。因而,将一个对象申明为常量必须十分小心。

正文完
 0