ES6的let,const到底存不存在变量提升?

在MDN是这样写的,阮一峰的es6入门也是说不提升ECMAScript 6 入门

在 ECMAScript 2015 中,let 绑定不受变量提升的约束,这意味着 let 声明不会被提升到当前执行上下文的顶部。

然而,我今天听到交流群里有人说它们其实是提升了,我搜索了一下,发现网上有不少博客说其实是提升了,例如:let深入理解---let存在变量提升吗?
Are variables declared with let or const not hoisted in ES6?

所以请教一下各位,ES6的let,const到底存不存在变量提升?

阅读 9.1k
6 个回答

let 的「创建」过程被提升了,但是初始化没有提升。
var 的「创建」和「初始化」都被提升了。
function 的「创建」「初始化」和「赋值」都被提升了。
已解决,没人回答这社区太。。弃坑

“创建过程提升,初始化没有提升”,这么理解也可以,但是与官方定义不符。直接按照官方的解释“不提升,存在TDZ”不是更好吗,为什么非要往提升上面靠呢?

当然不存在! 会存在临时死区中,当你初始化的时候才会拿到想要的值。

let 和 const都不会被提升的,只需实验如下代码即可:

console.log(bbbb); // undefined
var bbbb = 10; 

console.log(aaaaa); // Uncaught ReferenceError: aaaaa is not defined
let aaaaa = 10;

console.log(cccc); // Uncaught ReferenceError: cccc is not defined
const cccc = 10;

直接说结果:存在变量提升。
但是为什么下面的情况会报错:

function foo(){
    console.log(_var);
    const _var = '_var';
}

仅仅是因为存在暂时性死区,跟变量是否提升无关系。
看图说话
image.png

let和const定义的变量都会被提升,但是不会被初始化,不能被引用,不会像var定义的变量那样,初始值为undefined。
当进入let变量的作用域时,会立即给它创建存储空间,但是不会对它进行初始化。

变量的赋值可以分为三个阶段:

  1. 创建变量,在内存中开辟空间
  2. 初始化变量,将变量初始化为undefined
  3. 真正赋值

关于let、var和function:

  • let 的「创建」过程被提升了,但是初始化没有提升。
  • var 的「创建」和「初始化」都被提升了。
  • function 的「创建」「初始化」和「赋值」都被提升了。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题