Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ES6 系列之 let 和 const #66

Open
yangtao2o opened this issue Apr 6, 2020 · 0 comments
Open

ES6 系列之 let 和 const #66

yangtao2o opened this issue Apr 6, 2020 · 0 comments

Comments

@yangtao2o
Copy link
Owner

yangtao2o commented Apr 6, 2020

ES6 系列之 let 和 const

为了加强对变量生命周期的控制,ECMAScript 6 引入了块级作用域

块级作用域存在于:

  • 函数内部
  • 块中(字符 { 和 } 之间的区域)

块级声明用于声明在指定块的作用域之外无法访问的变量。

let 和 const 都是块级声明的一种。特点有:

  1. 不会被提升
  2. 重复报错
  3. 不绑定全局作用域

const 用于声明常量,其值一旦被设定不能再被修改,否则会报错。const 声明不允许修改绑定,但允许修改值。

临时死区(Temporal Dead Zone),简写为 TDZ。

let 和 const 声明的变量不会被提升到作用域顶部,如果在声明之前访问这些变量,会导致报错:

console.log(typeof value); // Uncaught SyntaxError: Identifier 'value' has already been declared
let value = 1;

这是因为 JavaScript 引擎在扫描代码发现变量声明时,要么将它们提升到作用域顶部(遇到 var 声明),要么将声明放在 TDZ 中(遇到 let 和 const 声明)。访问 TDZ 中的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从 TDZ 中移出,然后方可访问。

for 循环中使用 let 和 var,底层会使用不同的处理方式。

那么当使用 let 的时候底层到底是怎么做的呢?

简单的来说,就是在 for (let i = 0; i < 3; i++) 中,即圆括号之内建立一个隐藏的作用域。然后每次迭代循环时都创建一个新变量,并以之前迭代中同名变量的值将其初始化。类似这样的伪代码:

(let i = 0) {
 funcs[0] = function() {
  console.log(i)
 };
}

(let i = 1) {
 funcs[1] = function() {
  console.log(i)
 };
}

学习资料:ES6 系列之 let 和 const

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant