js词法分析

javascript词法分析
函数在运行的瞬间,生成一个活动对象(Active Object),简称AO;
具体分为两个阶段:
一.分析阶段
JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤:
1.分析参数
2.分析变量声明
3.分析函数声明
二.执行阶段 (即做赋值等操作)
具体例子及简单分析步骤如下:
*1.无参数情况*
1 function func() {
2       console.log(age);
3       var age = 25;
4       console.log(age);
5       function age() {
6       }
7       console.log(age);
8   }
9 func();
1.1详细分析步骤
// 分析阶段
形成活动对象AO, 假设 AO = {};
1)分析参数
a.分析形参(没有跳过)
b.分析实参(没有跳过)
2)分析变量声明
a. AO.age = undefined;(在函数分析阶段默认往AO活动对象添加属性值为undefined);
3) 分析函数声明
a. AO.age = function(){};(如果AO中已存在age属性直接做覆盖操作,如果不存在则新建age属性进AO)
// 执行阶段
1.打印 function() {};
2.age赋值25 AO.age = 25;
3.打印 25;
4.打印 25;
**//以下例子同上类似步骤简写分析**
*2.有参数情况*
1 function func(age) {
2       console.log(age);
3       var age = 25;
4       console.log(age);
5       function age() {
6       }
7       console.log(age);
8   }
9 func(18);
2.1
// 分析阶段
1)分析参数
a. AO.age = undefined;
b. AO.age = 18;
2)分析变量声明
AO.age = 18; (AO中已存在age属性)
3.分析函数声明
AO.age = function() {};
//执行阶段
1.打印 function() {};
2.赋值后打印 AO.age = 25;
3.打印 25;
*3.报错情况*
 1 function func(age) {
 2       var age;
 3      console.log(age);
 4       var age = 25;
 5       console.log(age);
 6       function age() {
 7           console.log(age);
 8       }
 9       age();
10      console.log(age);
11  
12  }
13 func(18);
3.1
// 分析阶段
1.分析参数
a. AO.age = undefined;
b. AO.age = 18;
2.分析变量声明
AO.age = 18;(AO中已存在,保持不变);
3.分析函数声明
AO.age = function() {}; (存在age属性覆盖)
//执行阶段
1.打印 function() {};
2.赋值后打印 25;
3. age is not a function;(执行函数时AO的age已经为25)
4. 报错不执行;
*4.变量提升情况*
1 var name = "test";
2 function t() {
3     console.log(name);
4     var name = "test1";
5     console.log(name);
6 }
7 t();
类似写法
var name = "test";
function t() {
var name;
console.log(name);
name = "test1";
console.log(name);
}
t();

4.1

// 分析阶段
1.分析参数(没有参数跳过)
2.分析变量声明
AO.name = undefined;
3.分析函数声明(没有跳过)
//执行阶段
1.打印 undefined;
2.赋值后打印 test1;
注:
1.函数声明在分析阶段操作
2.函数表达式在执行阶段操作

转载于:https://www.cnblogs.com/jiaqi1719/p/10019689.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使一维数组一行一行的输出成二维数组的格式

以9个元素的数组为例,输出3x3的格式 基本思想是对每一个元素的index进行检查,当index是3,6,9等可以被3整除的数时,在打印它们之前,先打印一个\n。注意0也可以被3整除,但是此时不打印\n,所以要加上i>0的…

python我想对你说_python学习第3天-----字典、解构

1.字典1)定义:查找速度快,效率高;用{}括起来,内部使用key:value的形式来保存数据;键值对是无序的,不是按照定义的方式保存数据的(类似于json文件),例如: {jay:周杰伦,jj::林俊杰}注&…

bms_output.put_line使用方法

https://blog.csdn.net/sxww321/article/details/4020300转载于:https://www.cnblogs.com/diyunpeng/p/10022923.html

linux 权限掩码 umask

一 权限掩码umaskumask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常用到的是后3个,例如你用chmod 755 file(此时这文件的权限是属主读(4)写(2)+执行(1),同…

ant 构建_有用的Ant构建标签

ant 构建问题: 如何在ant文件中执行以下任务? 制作zip文件。 运行命令。 将文件复制到远程计算机。 在远程Linux机器上运行命令。 打开输入框并响应输入值。 拨打蚂蚁电话。 答案: 1.制作zip文件: 以下是在ant中制作zip文…

C++文件交互(txt、excel)

前些天完成了计算机视觉大作业,《基于双目立体视觉的深度图像生成》,虽然刚开始觉得作业很难,也没找到现成的程序,但做到最后还是学到很多知识,get到很多技能,现在一一总结下来。 1、C输出数据到txt 包含…

基类数组存放派生类_永远不要将派生类数组赋值给基类类型指针

C.152: Never assign a pointer to an array of derived class objects to a pointer to its baseC.152:永远不要将派生类数组的指针赋值给基类指针Reason(原因)Subscripting the resulting base pointer will lead to invalid object access and probably to memory corruptio…

路由器和网关的区别?

1.网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.2…

C++error:找不到指定文件

做作业遇到这样的问题:新建了一个C工程,在内部新建了a.cpp a.h文件,将另一个工程里面的内容复制了过来,但是运行显示“找不到指定文件”,找了一下,发现虽然我的项目源文件里包换这个cpp文件,但是…

MVC 1.0的可能方法

如《 Java EE 8积极路线图》中所述,Java EE 8计划中未包含MVC 1.0。 我的看法以及在JavaOne期间与我交谈过的几个人的指示,这样做的可能结果是: MVC已完全删除 MVC继续并包含在Java EE 8(JSR 366)中 MVC继续作为Ja…

ES2015 中的函数式Mixin

原文链接:http://raganwald.com/2015/06/17/functional-mixins.html 在“原型即对象”中,我们看到可以对原型使用 Object.assign 来模拟 mixin,原型是 JavaScript 中类概念的基石。现在我们将回顾这个概念,并进一步探究如何将功能…

spring中的设计模式_面试:设计模式在spring中的应用

设计模式为我们解决一类问题提供了最佳的解决方案,我们在实际工作其实不太常用到,以至于会经常想不到设计模式。究其原因都是我们只是在使用别人框架的缘故,在这些框架的代码中经常能看到设计模式的影子,我们以spring为例&#xf…

linux route命令的使用详解

route命令用于显示和操作IP路由表。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是 为了解决以下问题:该Linux系统在一个局域网中,局…

C如何将二维数组作为返回值

做大作业遇到这样一个问题:在子函数里申请了一个二维数组,在主函数里要用到二维数组里的数据,但是在主函数里又不能提前申请(因为不知道数组长度),所以需要将数组return得到。 子函数: float **…

Spring的IOC底层实现

IOC的底层实现 续图: 转载于:https://www.cnblogs.com/phyger/p/10027712.html

python传文件给java_python使用简单http协议来传送文件

python使用简单http协议来传送文件!在ubuntu环境下,局域网内可以使用nc来传送文件,也可以使用基于Http协议的方式来下载文件我们可以使用python -m SimpleHTTPServer ${port}来启动服务默认的端口是8000,另外我们也可以指定端口&a…

C定义全局变量

程序工程中往往遇到这样的问题:某个变量是贯穿始终的,主函数以及不同的子函数都要用到这个变量,并且要调用子函数改变变量的值。这时候全局变量就起到一个桥梁作用,在函数外定义,在主函数中调用定义,在子函…

tensorflow(centos 7.0 64)安装

tensorflow安装 系统centos 7.0 64位: python版本:(注意tensorflow目前只支持python2.7版本) 安装pip yum update -y && yum install -y python python-devel epel-release.noarch python-pip 使用pip安装tensorflow pip install https://storag…

午餐前如何安装OpenStack Cloud

图1. QuickStart的内部工作原理 云安装程序 如果我告诉您可以在必须停下来吃午餐之前进行OpenStack Cloud环境设置,该怎么办? 您会感到惊讶吗? 你今天可以做吗? 在大多数情况下,我敢打赌您的答案是不可能的&#…

实现多线程的方式之实现Callable接口

package com.hls.juc;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/** * 创建多线程的方式 : 4种 * 1.继承Thread类 * 2.实现Runable接口 * 3.实现Callable接口 * 4.使用线程池创建线程 * *…