JavaScript变量声明是如何实现的?var提前打印为何返回undefined而非引用错误
问题原因:JavaScript变量提升(Hoisting)机制
你遇到的运行结果是var声明的变量特有的提升行为导致的,不会抛出ReferenceError的核心原因是:变量在你写的声明语句之前,就已经被JS引擎提前注册到当前作用域了。
JS代码的执行分为预编译和逐行执行两个阶段,对应你的代码具体执行逻辑如下:
- 预编译阶段:JS引擎会扫描当前作用域的所有声明语句,所有用
var关键字声明的变量都会被提前“提升”到当前作用域的最顶部完成声明,该阶段只做声明不做赋值,变量默认初始值为undefined。 - 逐行执行阶段:你写的原始代码
实际执行顺序等价于:console.log(x) var x = 10;var x = undefined; // 预编译阶段已经完成的操作 console.log(x); // 此时x已经声明,只是未手动赋值,输出undefined x = 10; // 赋值操作在打印之后才执行
只有当你访问一个完全没有在任何作用域中声明过的变量时,才会抛出ReferenceError。你这段代码里的x已经在预编译阶段完成声明,所以不会触发报错。
补充说明:ES6引入的
let、const关键字也存在变量提升,但和var不同的是,它们在声明语句之前的访问区间属于暂时性死区(Temporal Dead Zone),此时访问变量会直接抛出ReferenceError,如果你把代码中的var替换为let,就会得到你预期的报错结果。
内容的提问来源于stack exchange,提问作者ankita gupta
相关产品推荐
相关产品推荐

