关于变量提升

2019-10-22  本文已影响0人  Eileen_1d88

一般被问到var和let的区别的时候,我都会说var会有变量提升,let没有变量提升。那么这样一段代码,让我对这个答案产生了疑问:

var a = 1;
(function() {
  console.log(a);
  let a = 2
})()

结果是报错,如果let没有变量提升的话,那么a应该是1,为什么会报错呢?

参考这篇文章,觉得讲得很清楚,这里只是自己做一下知识记录。

变量提升会经历创建、初始化、赋值3个过程。
var创建一个变量会经历【创建、初始化】过程;
let创建一个变量会经历【创建】过程;
function会经历【创建、初始化、赋值】过程;
因为function一定会被赋值,所以

function a() {
};
var a = 1;
console.log(typeof a) // 输出 number

let声明的变量只会创建一次,所以

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

const和let差不多, 但是const没有不能被赋值,类似const x = 1;是创建和初始化过程。
这样就比较能理解暂时性死区(TDZ)了;在一个块作用域中,一个变量在声明之前使用,该变量只经历了创建阶段,没有初始化,也没有赋值,所以变量没有值,那么这个时候使用这个变量,自然就会报错了。

上一篇 下一篇

猜你喜欢

热点阅读