ES6学习笔记一:let、const与作用域
前言
此系列文章用于记录小萌新的ES6的学习经历如有什么错误或者不好的地方请各位大佬多多指教
一、ES6新增块关键字let、const
在ES5中只有var关键字来定义变量,ES6新增了两个关键字let和count对变量进行声明,
并且在ES5中作用域方面不支持块级作用域。而ES6添加这两个关键字就是为了划分块级作用域
二、let关键字
2.1.基本方法
ES6 新增了 let 命令,用于声明变量。其用法类似于 var ,但是所声明的变量只在 let命令所在的代码块内有效。
代码如下(示例):
{
let a = 10;
var b = 1;
}
console.log(b); // 1
console.log(a); // ReferenceError: a is not defined
上面的代码在let声明的块作用域外进行使用会报错, 而var返回了正确的值,所以let只能在所定义的块作用域里面进行使用
注意:
代码如下(示例):
{
var b = 5;
var b = 1;
console.log(b); // 1
}
{
let a = 10;
let a = 1;
console.log(a); // SyntaxError: Identifier 'a' has already been declared
}
上面的代码var声明的变量可以重新定义覆盖,而let不能重新定义相同名字的变量。
2.2.不存在变量提升
在js中var定义变量时,会出现变量提升的现象即在定义变量之前进行使用会显示var为undefined并不会报错。而let所定义的变量则没有变量提升的问题。
代码如下(示例):
console.log(b); // undefined
var b = 1;
console.log(a); // ReferenceError: a is not defined
let a = 10;
2.3.暂时性死区
S6明确规定,如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。
在代码块内,使用let命令声明变量之前,该变量都是不可用的,这个区域被称为“暂时性死区”。
{
var temp = 123;
if (true) {
console.log(temp); //ReferenceError: Cannot access 'temp' before initialization
let temp;
}
}
三、const关键字
3.1.基本方法
声明一个只读的常量,一旦声明,其值不能改变且必须立即初始化。
除此之外,与let用法一致。
在下面这种情况当常量保存的不是一个值,而是一个地址的时候,该常量所引用的对象是可以更改成员的,只是不能更改该常量保存的地址。
{
const foo={
y:10};
foo.x=100;
console.log(foo.x);
foo={
n:1000};
}