读阮一峰ECMAScript 6入门笔记之let 和 const 命令

1.let 和 const 命令

1 let 命令
ES6新增let命令,用于声明变量。let 跟 var 的用法类似,但是let 只在它所在的代码块中有效。

{
	let a = 1;
	var b = 2;
}
a // ReferenceError: a is not defined.
b // 2

for 循环的计数器,适合使用 let 命令。for 循环中,设置循环变量的那部分是一个父作用域,循环内部是一个单独的子作用域。

for (let i = 0; i < 2; i++) {
  let i = '123';
  console.log(i);
}
// 123
// 123

let不存在变量提升,即 let 声明的变量必须在声明后才能使用,否则将会报错。而 var 声明的变量可以在声明前使用,它的值为 undefined 。

console.log(a); // 输出undefined
var a = 1;
console.log(b); // 报错ReferenceError
let b = 2;

ES6 明确规定,如果区块中存在 let 和 const 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
因此,在代码块内,使用 let 跟 const 命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。
“暂时性死区”会使得 typeof 出现错误。当变量 a 使用 let 声明之前,使用 typeof 就会报错,若变量 a 本就没有声明,则会返回 undefined 。

typeof a; // ReferenceError
let a;
typeof a // "undefined"

暂时性死区的本质是只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
let 不允许在同一个作用域中,重复声明一个变量。

// 报错
function func() {
  let a = 1;
  let a = 2;
}
function func(a) {
  let a;
}
func() // 报错

function func(a) {
  {
    let a;
  }
}
func() // 不报错

2.块级作用域
为什么需要块级作用域?
1.避免内层变量可能会覆盖外层变量。
2.避免用来计数的循环变量泄露为全局变量。
3.使得内层作用域可以定义外层作用域的同名变量。
4.使得获得广泛应用的匿名函数(匿名IIFE)立即执行表达式不是必要了。

块级作用域与函数说明
1.块级作用域中,函数说明的行为类似于 let ,在块级作用域之外不可引用。
但是在ES6浏览器中:
允许在块级作用域内声明函数。
函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
同时,函数声明还会提升到所在的块级作用域的头部。
2.尽可能避免在块级作用域中声明函数,需要也该写出函数表达式。
3.ES6 的块级作用域必须有大括号,如果没有大括号,JS 引擎就认为不存在块级作用域。

3.const 命令
1.const声明的变量不得改变值,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
2.const的作用域与let相同:只在声明所在的块级作用域内有效。
3.const声明的常量也是不提升,同样会存在暂时性死区,只能在声明后使用。
4.const声明的常量,也与let一样不可重复声明。
本质:const 不变的是变量指向的那个内存地址不得改动。内存地址保存的是一个指向实际数据的指针,const只能保证这个指针是固定的(即指向另一个固定的地址),至于它指向的数据结构是不是可变的,就不能控制了。

ES6 声明变量的六种方法:
1.var命令 2.function命令 3.let 命令 4.const命令 5.import命令 6.class命令

4.顶层对象的属性
顶层对象:浏览器指window对象,Node指global对象。
ES6中var命令和function命令声明的全局变量,是顶层对象的属性;let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。

5.globalThis 对象
任何环境下,globalThis都是存在的,都可以从它拿到顶层对象,指向全局环境下的this。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值