JS中的作用域与作用域链

本文介绍了JavaScript中的执行期上下文、作用域和作用域链的概念。执行期上下文是在函数执行前创建的内部对象,每个函数都有独一无二的执行上下文。作用域是函数内的[[scope]]属性,用于存储执行环境的集合。作用域链则是执行环境的线性链式链接,用于变量查找。全局环境是作用域链的顶部,变量查找从上至下进行。全局和局部环境间的作用域访问具有单向性,外部无法访问内部变量。

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

一、相关知识

1、执行期上下文

函数执行的前一刻,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕时,它所产生的执行上下文会被销毁。

2、作用域

每个JavaScript函数都是一个特殊的对象,对象中有的属性我们可以访问,但有的不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个,[[scope]]就指的是作用域,其中存储了运行期上下文的集合。

3、作用域链

每个函数执行的时候都有自己的执行环境。当代码在一个环境中执行的时候,会创建对象的一个作用域链(scope chain),也就是[[scope]]中所存储的执行期上下文对象的链式集合链接。

注意点:查找变量是从作用域链的顶部依次向下查找。全局执行环境是最外围的一个执行环境,在Web浏览器中,全局执行环境被认为是window对象。某个执行环境中的所有代码被执行完毕之后,该环境会被销毁,保存在其中所有的变量和函数定义也会随之被销毁。

二、全局环境与局部环境 

       内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。这些环境之间的联系是线性的、有次序的。在每个环境中都可以向上搜索存在的作用域链;但是任何环境都不能通过向下搜索作用域链而进入另一个执行环境。(注:本实例来自于《JavaScript高级程序设计》一书)

           var color = "blue";
           
           function changeColor () {
               var anotherColor = "red";
               
               function swapColor (){
               	  var tempColor  = anotherColor;
                  anotherColor =color;
                  color = tempColor;
                  //这里可以访问color、anotherColor和tempColor
               }
               
               //这里可以访问color、changeColor,但是不能访问tempColor
               swapColor();
           }
           //这里只能访问color
           changeColor();

三、图解作用域链创建过程

以如下代码程序为例,用图来解释:

           function a () {
             	function b () {
           		    var  b = 234;
             	}
              	var a = 123;
           	    b();
             }
                var glob = 100;
                a();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值