位置: 编程技术 - 正文

深入理解JavaScript高级之词法作用域和作用域链(深入理解javascript特性.pdf)

编辑:rootadmin

主要内容:1、分析JavaScript的词法作用域的含义

2、解析变量的作用域链

3、变量名提升时什么

最近在传智播客讲解JavaScript的课程,有不少朋友觉得JavaScript是如此的简单,但是又如此的不知如何使用,因此我准备了一些内容给大家分享一下. 这个系列主要讲解JavaScript的高级部分的内容,包括作用域链、闭包、函数调用模式、原型以及面向对象的一些东西. 在这里不包含JavaScript的基本语法,如果需要了解基础的同学可以到 好了,废话不多说,直接进入我们的正题.

一、关于块级作用域说到JavaScript的变量作用域,与咱们平时使用的类C语言不同. 例如C#中下面代码:

这段代码如果进行编译,是无法通过的,因为"当前上下文中不存在名称num". 因为这里变量的作用域是由花括号限定的,称为块级作用域.

在块级作用域下,所有的变量都在定义的花括号内,从定义开始到花括号结束这个范围内可以使用. 出了这个范围就无法访问. 也就是说代码

这里可以访问,因为变量的定义与使用在同一个花括号内.

但是在JavaScript中就不一样,JavaScript中没有块级作用域的概念.

二、JavaScript中的作用域在JavaScript中,下面代码:

运行的结果是弹窗. 那么在JavaScript中变量的作用范围是怎么限定的呢?

2.1 函数限定变量作用域在JavaScript中,只有函数可以限定一个变量的作用范围. 什么意思呢?就是说,在JavaScript中,在函数里面定义的变量,可以在函数里面被访问,但是在函数外无法访问. 看如下代码:

这段代码运行时,会抛出一个异常,变量num没有定义. 也就是说,定义在函数中的变量无法在函数外使用,当然在函数内可以随意的使用, 即使在赋值之前. 看下面代码:

这段代码运行后,不会抛出错误,弹窗两次,分别是 undefined 和 (至于为什么,下文解释).

从这里可以看得出,变量只有在函数中可以被访问. 同理在该函数中的函数也可以访问.

2.2 子域访问父域前面说了,函数可以限定变量的作用域,那么在函数中的函数就成为该作用域的子域. 在子域中的代码可以访问到父域中的变量. 看下面代码:

这段代码执行得到的结果就是 . 可以看到上文所说的变量访问情况. 但是在子域中访问父域的代码也是有条件的. 如下面代码:

这段代码比前面就多了一个"var num = ;",这句代码在子域中,那么子域访问父域的情况就发生了变化,这段代码打印的结果是 . 即此时子域访问的num是子域中的变量,而不是父域中的.

由此可见访问有一定规则可言. 在JavaScript中使用变量,JavaScript解释器首先在当前作用域中搜索是否有该变量的定义,如果有,就是用这个变量;如果没有就到父域中寻找该变量. 以此类推,直到最顶级作用域,仍然没有找到就抛出异常"变量未定义". 看下面代码:

这段代码执行后打印出. 如果将"var num = ;"去掉,那么打印的就是. 同样,如果再去掉"var num = ",那么就会出现未定义的错误.

三、作用域链有了JavaScript的作用域的划分,那么可以将JavaScript的访问作用域连成一个链式树状结构. JavaScript的作用域链一旦能清晰的了解,那么对于JavaScript的变量与闭包就是非常清晰的了. 下面采用绘图的办法,绘制作用域链.

3.1 绘制规则:1) 作用域链就是对象的数组2) 全部script是0级链,每个对象占一个位置3) 凡是看到函数延伸一个链出来,一级级展开4) 访问首先看当前函数,如果没有定义往上一级链检查5) 如此往复,直到0级链

3.2 举例看下面代码:

下面分析一下这段代码:-> 首先整段代码是一个全局作用域,可以标记为0级作用域链,那么久有一个数组var link_0 = [ num, func1, func2 ];// 这里用伪代码描述-> 在这里func1和func2都是函数,因此引出两条1级作用域链,分别为var link_1 = { func1: [ num, func2 ] };// 这里用伪代码描述var link_1 = { func2: [ num, func3 ] };// 这里用伪代码描述-> 第一条1级链衍生出2级链var link_2 = { func2: [ num ] };// 这里用伪代码描述-> 第二条1级链中没有定义变量,是一个空链,就表示为var link_2 = { func3: [ ] };-> 将上面代码整合一下,就可以将作用域链表示为:

-> 用图像表示为

图:_作用域链.bmp

注意:将链式的图用js代码表现出来,再有高亮显示的时候就非常清晰了.

有了这个作用域链的图,那么就可以非常清晰的了解访问变量是如何进行的:在需要使用变量时,首先在当前的链上寻找变量,如果找到就直接使用,不会向上再找;如果没有找到,那么就向上一级作用域链寻找,直到0级作用域链.

如果能非常清晰的确定变量所属的作用域链的级别,那么在分析JavaScript代码与使用闭包等高级JavaScript特性的时候就会非常容易(至少我是这样哦).

三、变量名提升与函数名提升

有了作用域链与变量的访问规则,那么就有一个非常棘手的问题. 先看下面的JavaScript代码:

执行结果会是什么呢?你可以想一想,我先不揭晓答案.

先来分析一下这段代码. 这段代码中有一条0级作用域链,里面有成员num和func. 在func下是1级作用域链,里面有成员num. 因此在调用函数func的时候,就会检测到在当前作用域中变量num是定义过的,所以就会使用这个变量. 但是此时num并没有赋值,因为代码是从上往下运行的. 因此第一次打印的是 undefined,而第二次打印的便是. 你答对了么?

像这样将代码定义在后面,而在前面使用的情况在JavaScript中也是常见的问题. 这时就好像变量在一开始就定义了一样,结果就如同下面代码:

那么这个现象常常称为变量名提升. 同样也有函数名提升这一说. 如下面代码:

好了,这段代码结果如何?或则应该有什么不一样,我先不说没留着读者思考吧!下一篇再做解答.

由于有了这些不同,因此在实际开发的时候,推荐将变量都写在开始的地方,也就是在函数的开头将变量就定义好,类似于C语言的规定一样. 这个在js库中也是这么完成的,如jQuery等.

四、小结

好了这篇文章主要是说明JavaScript的词法作用域是怎么一回事儿,以及解释如何分析作用域链,和变量的访问情况,最后留再一个练习收尾吧!!!

看下面代码执行结果是什么:

推荐整理分享深入理解JavaScript高级之词法作用域和作用域链(深入理解javascript特性.pdf),希望有所帮助,仅作参考,欢迎阅读内容。

深入理解JavaScript高级之词法作用域和作用域链(深入理解javascript特性.pdf)

文章相关热门搜索词:深入理解计算机系统,深入理解javascript,深入理解计算机系统,深入理解新发展理念,推进供给侧结构性改革,深入理解javascript特性,深入理解计算机系统,深入理解javascript,深入理解javascript特性.pdf,内容如对您有帮助,希望把文章链接给更多的朋友!

JavaScript Math.ceil() 函数使用介绍 Math.ceil(x)--返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入ceil是ceiling的缩写,中文"上限"的意思引用网址:

js的匿名函数使用介绍 1.匿名函数概述关于匿名函数的第一次认识还是在jquery源码里,打开jQuery首先看到的是(function(window,undefined){.......................})(window);这就是一个匿名函

js中对象的声明方式以及数组的一些用法示例 !DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.Transitional//EN""

标签: 深入理解javascript特性.pdf

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

上一篇:javascript如何创建表格(javascript绘制表格的二种方法)(javascript create)

下一篇:JavaScript Math.ceil() 函数使用介绍

  • 税财通财务软件备份与恢复
  • 什么叫风险纳税人员
  • 跨区域开票流程怎么走
  • 按差额缴纳增值税
  • 行政事业单位住房基金
  • 发票认证延期抵扣啥意思
  • 劳务派遣用工的岗位只能在哪些工作岗位上实施
  • 办公室租赁费计入什么科目
  • 出口关税如何做账
  • 雇主责任险保费计算公式
  • 公司账户转账转错了能退回来吗
  • 联通租赁官网
  • 进项税发票已经认证但对方又作废
  • 跨地区经营怎么交税
  • 有限合伙企业对外转让财产份额
  • 税控服务费全额抵扣文件
  • 普通股资本成本计算方法
  • 土地纳税申报表
  • 小规模企业增值税账务处理
  • 递延收益在现金流量表体现吗
  • 月末计提短期借贷利息
  • 小规模企业交纳印花税吗
  • 社会保险生育险能报多少
  • 现在还有票据法吗
  • 小型微利企业免税政策
  • OS X Yosemite系统怎么样 OS X Yosemite功能介绍
  • php preg_grep
  • cmdkill进程
  • 超出经营范围开票怎么处理
  • 土地价款会计分录
  • 购买办公用品怎么做明细账
  • 海峡群岛属于哪个洲
  • php删除指定字符串
  • 增值税缓息是什么意思
  • php调用url
  • 自行建造厂房如何缴税
  • 虚开增值税怎么查到的
  • 企业转租电费发票
  • 税款已缴纳后发票怎么查
  • 认缴制对实务操作的可能影响有哪些?
  • 企业的日常活动都有哪些
  • phpcms是什么框架
  • MongoDB的mongo shell常用操作方法及操作脚本笔记
  • 两个公司可以是一个注册地址吗
  • 个税赡养老人作废后无法修改
  • 股东分红方式如何约定
  • 分期收款开发票
  • 企业所得税年度纳税申报表A类怎么填
  • 单位收到社保补贴会计怎样处理
  • 公司车过户给个人多久不用补税
  • 上个季度增值税报错了
  • 本月工资未发个税能不能扣
  • 汽车销售公司购入汽车会计分录
  • 经营活动产生的现金净流量怎么算
  • 以下各项不属于肝郁气滞证表现的是
  • 财务会计与预算会计差异如何处理
  • 旅游企业相关服务案例
  • sql server安装完 C盘空间一直减少
  • dmidecode命令
  • windows怎么将任务栏放大
  • Ubuntu 14.04系统怎么安装Nvidia 私有显卡驱动?
  • gnaupdaemon.exe是什么
  • window8.1
  • linux可视化界面怎么输入代码
  • shell数组遍历
  • 批处理文件中echo什么意思
  • chrome调试js
  • jQuery EasyUI tree 使用拖拽时遇到的错误小结
  • python怎么调用shell脚本
  • javascript 二维数组搜索
  • jquery设置定时器
  • Android优化蓝牙
  • jquery调用iframe中的方法
  • python 终端
  • before和after在句子中怎么翻译
  • 常州国家税务局待遇
  • 玉林税务局班子成员
  • 资源税的税目有7个,其中不包括
  • 差额征税全额开票是什么意思
  • 党费减免规定
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设