位置: 编程技术 - 正文

结合代码图文讲解JavaScript中的作用域与作用域链(代码结构说明书)

编辑:rootadmin

推荐整理分享结合代码图文讲解JavaScript中的作用域与作用域链(代码结构说明书),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:关于代码编写及实际操作的收获,代码总结与感受,代码结构图怎么画,代码结构说明书,代码编写过程中的心得体会,代码合入,代码如何进行总结,代码如何进行总结,内容如对您有帮助,希望把文章链接给更多的朋友!

先上三段说明作用域的代码

这三段代码只有小许差异,但结果缺截然不同,例1分别输出[undefined , local , global],例2分别输出[global , local , local],例3结果输出[undefined , local , global],如果不能答对说明你对javascript的作用域特性还未理解透彻。

什么是作用域?

也许有人会问:变量a的作用域是什么?一会儿又问:函数a的作用域是什么?变量和函数的作用域分别是啥玩意?

我们先来看看“作用域”是什么意思,“作用域”拆开来就是“作用”和“域”

作用:访问、操作、调用…… 域:区域、范围、空间……

作用域就是变量和函数的可访问范围,或者说变量或函数起作用的区域。

1.javascript函数的作用域:

函数内的区域,就是这个函数的作用域,变量和函数在这个区域都可以访问操作。最外层函数外的区域叫全局作用域,函数内的区域叫局部作用域。

2.javascript变量的作用域:

在源代码中变量所在的区域,就是这个变量的作用域,变量在这个区域内可以被访问操作。在全局作用域上定义的变量叫全局变量,在函数内定义的变量叫局部变量。

简单地理解,JS源代码被函数{ }划分成一块一块的区域,这些区域换个身份就是某函数或某变量的作用域,变量的作用域和函数的作用域在源代码中有可能指的是同一块区域。

作用域链作用域链(Scope Chain)是javascript内部中一种变量、函数查找机制,它决定了变量和函数的作用范围,即作用域,理解作用域链的作用原理,上一篇文章的三个例子也就能理解了,从而知其然也知其所以然。

作用域链是ECMAScript-说明文档中的概念,javascript引擎是按ECMAScript-说明文档去实现的,了解javascript引擎的工作原理有利于我们理解javascript的特性,但绝大多数js程序员不会去了解非常底层的技术,所以阅读ECMAScript-说明文档,我们可以有一个直观的方式去模拟javascript引擎的工作原理。

本文将通过年的ECMAScript--3th第三版来说明作用域链的形成原理,将会介绍执行环境,变量对象和活动对象,arguments对象,作用域链等几个概念。年发布了ECMAScript--5th第五版,不同的是取消了变量对象和活动对象等概念,引入了词法环境(Lexical Environments)、环境记录(EnviromentRecord)等新的概念,所以两个版本的概念不要混淆了。

1.执行环境(Execution Contexts)

执行环境(Execution Contexts)也被翻译为执行上下文,当解析器进入ECMAScript的可执行代码,解析器就进入一个执行环境,活动的执行环境组成一个逻辑上的栈,在这个逻辑栈顶部的执行环境是当前运行的执行环境。

注:ECMAScript中有三种可执行代码,Global、Function和Eval,全局环境即是Global可执行代码,函数即是Function可执行代码。逻辑栈是一种特殊的数据存储格式,特点是‘先进后出,后进先出',添加数据会先压入逻辑栈顶部,删除数据必须先从顶部开始删除。

结合代码图文讲解JavaScript中的作用域与作用域链(代码结构说明书)

变量对象(Variable Object)、活动对象(Activation Object)和Arguments对象(Arguments Object)

每个执行环境都有一个与之关联的变量对象,当解析器进入执行环境时,就会创建一个变量对象,变量对象保存着在当前执行环境中声明的变量和函数的引用。

变量对象是一个抽象的概念,在不同的执行环境中,变量对象有不同的身份,在解析器进入任何执行环境之前,就已经创建了一个Global对象,当解析器进入全局执行环境时,Global对象就充当变量对象,当解析器进入一个函数时,就会创建一个活动对象充当变量对象。

2.解析器处理代码时的两个阶段

我们都知道javascript解析器是一段一段解析处理代码的,为毛?这就要涉及解析器处理代码时的两个阶段,解析代码和执行代码。

当解析器进入执行环境时,变量对象就会添加执行环境中声明的变量和函数作为它的属性,这就意味着变量和函数在声明之前已经可用,变量值为undefined,这就是变量和函数声明提升(Hoisting)的原因,与此同时作用域链和this确定,此过程为解析阶段,俗称预解析。接着解析器开始执行代码,为变量添加相应值的引用,得到执行结果,此过程为执行阶段。

举两个好吃的栗子:

上述全局环境中的代码解析执行后,会将Global对象作为变量对象,保存以下数据。

当解析器进入函数执行环境时,则会创建一个活动对象作为变量对象,活动对象还会创建一个Arguments对象,arguments对象是一个参数集合,用来保存参数,这就是我们写函数时可以使用arguments[0]等来使用参数的原因。

3.作用域链(Scope Chain)

每个执行环境都有一个与之关联的作用域链,当解析器进入执行环境时被定义,作用域链是一个对象列表,用来检索各个变量对象中的变量和函数,这样可以保证执行环境有权访问哪些变量和函数,举个栗子。

testFn2内未声明变量a,为什么testFn2能调用全局变量a?整个过程是怎么发生的呢?请看下图。

当解析器进入全局执行环境时,调用变量和函数时只在Global对象中查找。

当解析器进入testFn函数执行环境时,函数内部属性[[scope]]中首先填入Global对象,然后将testFn活动对象添加到Global对象之前,形成一个作用域链。

当解析器进入testFn2函数执行环境时,函数内部属性[[scope]]首先填入父级的作用域链,然后再将当前的testFn2活动对象添加到作用域链的前端,形成一个新的作用域链。

testFn2调用变量a时,首先在当前的testFn2活动对象中查找,如果没有找到就顺着作用域链向上,在testFn活动对象中查找变量a,如果没有找到再顺着作用域链向上查找,直到在最后Global对象中找到为止,否则报错。所以函数内部可以调用外部环境的变量,外部环境不能调用函数内部的变量,这就是作用域特性的原理。

Javascript 基础---Ajax入门必看 Ajax是现代Web应用程序开发的一项关键工具。它让你能向服务器异步发送和接收数据,然后用Javascript解析。Ajax是AsynchronousJavaScriptandXML(异步JavaScript与XML

js中window.open的参数及注意注意事项 IE9下使用window.open时需要注意name参数值不能有"-"出现,否则会出现脚本错误,IE9以及版本测试没有问题window.open(URL,name,specs,replace)参数说明URL可选。打开指

JavaScript基础重点(必看) 接触JavaScript这门语言也就很长的时间了,但从来没有系统的去了解这么语言。趁现在刚刚毕业以及某些原因无心工作的情况下去系统的了解一下这么语

标签: 代码结构说明书

本文链接地址:https://www.jiuchutong.com/biancheng/370154.html 转载请保留说明!

上一篇:全面了解js中的script标签(js怎么理解)

下一篇:Javascript中的delete操作符详细介绍(JavaScript中的数据类型分为两大类)

  • 小规模纳税开专票享受季度30万纳税
  • 向个人提供居住证明
  • 先包装后销售
  • 银行承兑汇票相当于贷款
  • 工资走公账和私账哪个好
  • 个税0申报漏了2年可以补报
  • 先报个税还是先报增值税,有影响吗?
  • 购买原材料记账凭证怎么写
  • 增值税组成计税价格包括消费税吗
  • 税收的优惠性政策包括哪些
  • 营改增后11
  • 生产用电费
  • 砂石加工行业交什么税
  • 小规模纳税人公司注销流程及费用
  • 劳务派遣公司发放工资是按照劳务报酬嘛
  • 提示涉税风险该怎么弄
  • 小规模纳税人水利建设基金计税依据是什么
  • 增值税税控盘服务费可以每年都抵扣吗
  • 资产减值损失填在资产负债表哪里
  • 税务咨询费用
  • 收到质量赔偿款从总账做账可以
  • 软件固定资产还是无形资产
  • 企业资产损失会计处理
  • 房屋拆迁过渡费由哪个部门发
  • linux ssh命令用法
  • 怎么证明公司的存在
  • 一般纳税人怎么算税
  • 桌面级cpu天梯图快科技
  • 劳务的完成程度可以采用如下方法确定
  • 非经营业务
  • 定额征收的个体户怎么做账
  • 圣托里尼岛具体位置
  • 企业所得税季度申报表A类
  • html制作网页教程
  • 建行E信通贴现需要发票吗
  • 不能抵扣的福利发票要勾选吗为什么
  • 终止经营净利润含义
  • 发票记账联可以给客户吗
  • 公司的融资租赁怎么做账
  • 购买防暑物资应放到哪个科目
  • 企业所得税怎么算
  • 记账凭证装订好了如何在拆开
  • 长期股权投资大白话解释
  • 社会保险差额缴纳
  • 盈余公积年初和年末没有变化
  • 税控盘退费怎么做会计分录
  • 发放个税返还用不用申报
  • 实业投资收益如何
  • 运费不支付会怎么样
  • 不需要计提折旧的情况
  • 个人原因指什么
  • 对公账户的钱可以花吗
  • 金蝶现金银行存款账怎么记账
  • 补记式余额调节法怎么写项目
  • mysql主界面
  • 微软股票
  • 怎样破解bios密码
  • win7打印机共享关闭密码保护
  • ubuntu切换登录用户
  • SUSE Linux Enterprise Server 设置防火墙开启ssh远程端口的方法
  • win7系统如何设置
  • win7u盘没有安全选项卡
  • Win10 Mobile 10586.164中文版升级截图曝光
  • Extjs gridpanel 出现横向滚动条问题的解决方法
  • bat获取当前路径的值
  • java获取两个日期间的所有月份
  • 怎么使用vue和axios连接后端
  • JQuery Ajax WebService传递参数的简单实例
  • javascript中的函数包括内置函数和自定义函数
  • gpu解码视频
  • win10安装python2.7
  • jquery 扩展事件
  • windows搭建python运行环境
  • 树形菜单html
  • jquery获取当前日期yyyymmdd
  • 充电桩充电怎么收费,几种收费方法
  • 国际税收管理处忙不忙
  • 税票开户银行怎么填写?
  • 政府征用土地社保补偿标准
  • 2021年税务高雅春联带横批
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设