JavaScript-执行环境和作用域

本文深入探讨JavaScript中的执行环境和作用域链。执行环境定义了变量和函数的访问权限,分为全局和函数执行环境。全局环境在浏览器中对应window对象,而在函数环境中,存在活动对象(AO)。作用域链确保对变量和函数的有序访问,尤其在函数嵌套情况下。全局环境的VO始终是作用域链的终点,而函数环境的VO(AO)则包含函数参数,并按嵌套顺序链接到其父环境的VO。了解这些概念对于JavaScript的正确理解和高效编程至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

执行环境可以说是JavaScript中最重要的一个概念了。(官方定义)执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都有一个与之关联的变量对象(VO,variable object)。从代码层面来看“执行环境”可以用VO这个变量对象来表示。我们在浏览器的Console中无法检测查看到,但是解析器在处理数据时会在后台使用它。

执行环境有两种:全局执行环境、函数执行环境。(其实还有一种eval()执行环境,但是eval()函数存在安全问题,目前JavaScript已经不建议使用了,所以也就不在文本的范围之内)。

全局执行环境:最顶层的执行环境,在Web浏览器中,全局执行环境对应的VO我们认为就是window对象(但是在Nodejs中非Web环境就不一定是window了),因此所有全局变量和函数都是作为window对象的属性和方法创建的。当关闭浏览器时,window对象会被销毁,保存在window中的所有变量和函数定义也会被销毁。

函数执行环境:当执行一个函数时,JavaScript才会创建一个新的函数执行环境,也会有一个对应的VO,但是这个VO我们有个专门的定义叫活动对象(AO, activation object)当这个函数执行完之后,则函数对应的VO对象将被销毁,保存在VO对象中的所有变量和函数定义也被销毁。

作用域链:刚刚说过当执行一个函数时,JavaScript才会创建一个新的函数执行环境。那么如果函数嵌套函数呢(套娃),那会不断的创建新的执行环境,函数执行完成后,又会套娃般的销毁执行环境。为了防止混乱,所以作用域链就有存在的价值了。作用域链就是为了保证对执行环境有权访问的所有变量和函数进行有序的访问。

作用域链链接的就是执行环境对应的VO作用域链的起始端始终都是当前执行代码所在执行环境对应的VO。如果这个执行环境是函数,那么对应的VO就等同于AO(前面说的活动对象),会默认包含一个变量arguments(没错,就是函数的参数)。作用域链中的下一个变量对象来自包含该函数的环境(比如嵌套这个执行函数的那个函数),而再下一个变量对象来自则来自于下一个包含环境。这样一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个VO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值