var、let、const、无申明 四种变量在赋值前,使用的情况
javascript
//var 变量
console.log(a); // 输出 undefined(不会报错)
var a = 5;
//let 变量
console.log(b); //ReferenceError: Cannot access 'b' before initialization (未初始化)
let b = 6;
//const 变量 ,变量赋值后不可修改,如果变量指向的是对象地址,对象内的内容,可以修改。
console.log(c); //ReferenceError: Cannot access 'c' before initialization (未初始化)
const c = 6;
//无申请明 变量:
console.log(d); //ReferenceError: d is not defined (未定义)
JavaScript 引擎在执行代码前,浏览器会对JS代码先进行编译,其中会扫描所有的变量进行登记造册,
var变量 被扫描到后,引擎会初始化该变量为一个特殊值:undefined
let/const变量 被扫描到后,只是做了一个登记,引擎不会初始化该变量。未赋值前使用,报 Cannot access 'x' before initialization。
无申明变量 ,在编译时都不会被扫描到,更不会做登记。未赋值前使用,报:ReferenceError: x is not defined (未定义)
变量提升这个术语,描述的正是这个"声明在编译阶段被提前处理"的现象。
var 的"提升"是声明+默认初始化(为undefined)。
let/const 的"提升"是声明+不初始化(形成暂时性死区)。