Javascript学习之作用域链详解

本文详细介绍了JavaScript中作用域链的工作原理,包括函数创建时如何保存父级变量对象及函数激活时作用域链的构建过程。

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

本文和大家分享的主要是javascript中作用域相关内容,一起来看看吧,希望对大家 学习javascript 有所帮助。
    在javascript中,查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从上层执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。
  下面,让我们以一个函数的创建和激活两个时期来讲解作用域链的变化。
  函数创建
  函数有一个内部属性[[scope]],当函数创建的时候,就会保存所有父变量对象到其中,你可以理解[[scope]]就是所有父变量对象的层级链。(注意:[[scope]]并不代表完整的作用域链!)
  举个例子:
  function foo() {
  function bar() {
  console.log(1)
  }
  }
  函数创建时,各自的[[scope]]为:
  foo.[[scope]] = [
  globalContext.VO
  ];
  bar.[[scope]] = [
  fooContext.AO,
  globalContext.VO
  ];
  函数激活
  当函数激活时,进入函数上下文,创建VO/AO后,就会将活动对象添加到作用链的前端。
  这时候执行上下文的作用域链,我们命名为Scope:
  Scope = [AO].concat([[Scope]]);
  至此,作用域链创建完毕。
  捋一捋
  以下面的例子为例,结合着之前讲的变量对象和执行上下文栈,我们来总结一下函数执行上下文中作用域链和变量对象的创建过程:
  var scope = "global scope";function checkscope(){
  var scope2 = 'local scope';
  return scope2;
  }
  checkscope();
  1.checkscope函数被创建,保存作用域链到[[scope]]
  checkscope.[[scope]] = [
  globalContext.VO
  ];
  2.执行checkscope函数,创建checkscope函数执行上下文,checkscope函数执行上下文被压入执行上下文栈
  ECStack = [
  checkscopeContext,
  globalContext
  ];
  3.checkscope函数并不立刻执行,开始做准备工作,第一步:复制函数[[scope]]属性创建作用域链
  checkscopeContext = {
  Scope: checkscope.[[scope]],
  }
  4.第二步:用arguments创建活动对象,随后初始化活动对象,加入形参、函数声明、变量声明
  checkscopeContext = {        AO: {            arguments: {                length: 0
  },            scope2: undefined
  }
  }
  5.第三步:将活动对象压入checkscope作用域链顶端
  checkscopeContext = {
  AO: {
  arguments: {
  length: 0
  },
  scope2: undefined
  },
  Scope: [AO, [[Scope]]]
  }
  6.准备工作做完,开始执行函数,随着函数的执行,修改AO的属性值

来源:SegmentFault
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值