一、词法分析方法

js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤:

  • 分析参数
  • 再分析变量的声明
  • 分析函数说明

二、具体步骤如下:

函数在运行的瞬间,生成一个活动对象(Active Object),简称AO
分析参数:
  函数接收形式参数,添加到AO的属性,并且这个时候值为undefine,例如AO.age=undefine
  接收实参,添加到AO的属性,覆盖之前的undefine
分析变量声明,如var age;或var age=23;
  如果上一步分析参数中AO还没有age属性,则添加AO属性为undefine,即AO.age=undefine
  如果AO上面已经有age属性了,则不作任何修改
分析函数的声明,如果有function age(){}
  把函数赋给AO.age ,覆盖上一步分析的值

三、示例

这样我们先通过一段代码来理解词法分析:

<script>
function t1(age) {
console.log(age);
var age = 27;
console.log(age);
function age() {}
console.log(age);
}
t1(3);
</script>

词法分析阶段:

  • 首先形成Active Object即AO对象
  • 第一步:分析形式参数

  AO.age = undefine

  传入实参即对AO.age=undefine进行覆盖:

  AO.age = 3

  • 第二步:分析局部变量

  存在var age = 27;

  这个时候遵循如果AO.age存在值则不作任何修改,按照第一步分析的最后结果AO.age = 3,所以这里不作任何修改即:

  AO.age = 3

  • 第三步:分析函数的声明,

  因为函数中存在function age(){}函数

  所以按照规则应该将函数赋值给AO.age覆盖第二步分析的AO.age = 3即:

  AO.age = function age(){}

执行阶段:

  执行t1函数,到console.log(age)时,词法分析的最后AO.age= function age(){},所以会打印:

  function age(){}

  var age=27;给age赋值27

  到第二个console.log(age)这个时候age已经重新被赋值27,所以这个时候会打印:

  27

  function age() 并没有调用所以并不会执行

  到第三个console.log(age)这个时候age的值并没有被再次修改,所以这个时候会打印:

  27

  运行js查看结果如下与我们分析的完全相符:

   

python成长之路【第十六篇】:JavaScript的高级知识---词法分析的更多相关文章

  1. python成长之路【第六篇】:python模块--time和datetime

    1.时间表现形式 时间戳  (1970年1月1日之后的秒,即:time.time())格式化的时间字符串   (2014-11-11 11:11,    即:time.strftime('%Y-%m- ...

  2. Python之路(第二十六篇) 面向对象进阶:内置方法

    一.__getattribute__ object.__getattribute__(self, name) 无条件被调用,通过实例访问属性.如果class中定义了__getattr__(),则__g ...

  3. Python之路(第十六篇)xml模块、datetime模块

    一.xml模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单, xml比较早,早期许多软件都是用xml,至今很多传统公司如金融行业的很多系统的接口还主要 ...

  4. python成长之路【第八篇】:异常处理

    一.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! 语法: try: pass except Exc ...

  5. python成长之路【第五篇】:python字符编码

    在2.7环境中我们要写上这一行#-*- coding:utf-8 -*- 为什么我们要加这一行呢?这一样的意思是置顶编码类型为utf-8编码! 首先在看这个问题之前,咱们是否曾想过一个问题? 为什么我 ...

  6. python成长之路【第十三篇】:Python操作MySQL之pymysql

    对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎 ...

  7. python成长之路【第七篇】:面向对象

    概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向对象三大特性 面向 ...

  8. python成长之路【第四篇】:装饰器

    实现装饰器的知识储备: 示例: def f1(): print("f1") 1.函数即“变量” #上面的示例中,函数f1为变量,它指向内存地址.而f1()表示函数执行. 2.高阶函 ...

  9. python成长之路【第三篇】:函数

    1.函数基础 函数是python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构. 函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件. 函数用于将相关功能打包并参数. pyth ...

随机推荐

  1. AIX 5L 系统管理技术 —— 存储管理——物理卷

    一.向系统中添加一块硬盘 方法一 该方法适用于在配置之前能够重新启动系统的情况.在系统启动时,就会运行cfgmgr命令,它可自动配置系统中的新设备.当完成了系统启动后,以root用户进入系统,用lsp ...

  2. Python爬虫学习

    lxml相关 http://blog.csdn.net/kl28978113/article/details/52241678  lxml安装 http://www.lfd.uci.edu/~gohl ...

  3. Centos vsftpd服务器搭建

    Centos vsftpd服务器搭建 时间:2016-07-18 1.最为简单的vsftpd服务器搭建 1.安装vsftpd 1.yum 安装 yum install vsftpd 2.rpm文件安装 ...

  4. Delphi 调用C# DLL(包含委托)

    例子 C# Dll: using System; using System.Collections.Generic; using System.Text; using System.Diagnosti ...

  5. asp .Net TreeView实现数据绑定和事件响应

    最近做了一个图书馆管理系统,其中要实现中图法分类号查询,因为初学asp ,感觉还有点难度, 第一步:数据库文件 第二步 向界面中拖进TreeView控件 第三步添加事件 下面是cs文件代码 //Tre ...

  6. Intent传递数据的方法

    一.传递List 1.传递List<String>的方法 ArrayList<String> info = new ArrayList<String>(); inf ...

  7. js 一个自写的 监测类

    自从认识了jQuery后,很多页面加载入口,都放在document.ready里面.但是有时候这个觉得ready加载太慢, 这个[监测类 ]就开始产生了 效果类似这个. 每10毫秒检查一次,直到加载了 ...

  8. Notepade ++ 替换每行最后的换行符

    Steps: 1. Copy the file need to be replaced into Notepade ++ 2. Ctrl+A to select all->Ctrl+F to p ...

  9. xshell5激活

    Xshell是一个用于MS Windows平台的强大的SSH,TELNET,和RLOGIN终端仿真软件.它使得用户能轻松和安全地从Windows PC上访问Unix/Linux主机.以上内容全部为广告 ...

  10. 将windows server 2016改造为像windows 10一样适合个人使用的系统

    Windows server 2016 RTM已流出,具体可以搜索wzor大神泄露的,英文版本是0911的.现根据我安装后整理的如何配置使个人更适合使用. 20170102更新:wzor泄漏的0911 ...