
JavaScript提升机制如同舞台搭建,在代码执行前(“创建阶段”),所有声明会被移动到其作用域顶部。这就好比舞台工作人员在幕布升起前将道具摆放到位。需要注意的是,只有声明被移动,初始化操作则保留在原位。
根据ECMAScript规范,此行为是JavaScript在创建阶段创建“词法环境”的一部分。简单来说,JavaScript会在运行代码前对其进行“预扫描”。
var 提升:
console.log(x); // 输出: undefinedvar x = 5;console.log(x); // 输出: 5
var声明的变量x被提升到作用域顶部,但x = 5的初始化操作未被提升。因此,第一次console.log(x)输出undefined,而非报错,因为变量x存在,但尚未赋值。
立即学习“Java免费学习笔记(深入)”;
let 和 const 提升及暂时性死区 (TDZ):
console.log(y); // 抛出错误: ReferenceError: Cannot access 'y' before initializationlet y = 10;console.log(y); // 输出: 10
let和const声明的变量也会被提升,但它们被放置在暂时性死区 (TDZ) 中,直到初始化的那一行代码被执行。在初始化之前访问let或const变量会导致ReferenceError错误。这与var不同,var在类似情况下会返回undefined。
TDZ 意味着在初始化之前访问const声明的变量也会报错。这与var不同,var在类似情况下会返回undefined。ECMAScript规范称此行为为“暂时性死区语义”,简单来说,就是JavaScript防止我们在变量初始化之前访问它。
提客AI提词器
「直播、录课」智能AI提词,搭配抖音直播伴侣、腾讯会议、钉钉、飞书、录课等软件等任意软件。
64 查看详情
更复杂的例子:
function setUpEventHandler() { handleClick(); // 可执行! const config = { debug: true, }; function handleClick() { if (config?.debug) { // undefined! console.log("debug mode"); } }}setUpEventHandler();
函数声明handleClick被提升,因此可以提前调用。但config对象则没有被提升,所以handleClick内部访问config时,config尚未被初始化,导致config.debug为undefined。
类提升:
类的提升机制与函数不同。
const dog = new Animal(); // 抛出错误!class Animal { constructor() { this.type = "mammal"; }}
类声明在初始化之前无法访问,它们一直处于TDZ,直到其定义被评估。这意味着在声明之前无法使用类。
总结: 记住,虽然声明被提升到顶部,但初始化操作仍然保留在原位。
以上就是JavaScript提升 – 移动和停留什么的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/371334.html
微信扫一扫
支付宝扫一扫