一般被问到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)了;在一个块作用域中,一个变量在声明之前使用,该变量只经历了创建阶段,没有初始化,也没有赋值,所以变量没有值,那么这个时候使用这个变量,自然就会报错了。
网友评论