js中的词法分析

js中的词法分析:当js中的函数执行时,先分析后执行。

1.词法分析要做几件事??
  1).分析参数
  2).分析变量
  3).分析函数
         分析顺序如上。


2.如何分析变量声明

如var str='xin'这个语句是先分析 声明var str 此时值是undefine
 

这个语句等价于:
  function test(){
    var str;
   alert(str);//此时值是undefine
   str='xin';//然后给str变量赋值
   alert(str);//此时值是xin 
  }


3.看看例子,考考自己:
 3.1 
  function test(age){
   alert (age);
   var age=12;
   alert(age);
  }
  test(99);
 问题:现在打印什么??
  99     12
      解答:由于js中的要进行词法分析,首先分析参数,然后是变量,最后是函数
     所以age的值变换为  undifine=====>99 ====>12
 大家答对了吗???如果没有答对,就继续向上下看,我会再后面给大家写出答案的解析。


4.为大家解释3.1的原理
 要想弄懂这个,就要了解js中的活动对象(Active Object)的概念
 函数的变量,有其作用域
 而这个作用域又在哪,??在AO上,也就是活动对象。
 
5.AO(活动对象Active Object)的介绍。
 在函数的调用瞬间时会产生一个AO对象,这个AO对象的属性,即存储着它的变量

6.现在我们一起来看上面3.1的事例吧!!!
 
 
  function test(age){
   alert (age);
   var age=12;
   alert(age);
  }
  test(99);

  当我们调用test函数时,就在这一瞬间,产生了一个Active Object (活动对象简称AO),即然他是一

         个对象,那么它就应该有属性,这个属性来自于3个地方(即接收参数,变量声明,分析方法)
  上例可变形为:
   AO.age=undifine;
   AO.age=99;
   //所以第一次打印时是99
   而 var age=12;在AO对象已经有这个属性了,就不会再次词法分析了
   故只是现有AO对象的age属性赋值的过程
   AO.age=12;//等同于var age=12;
   //所以第二次打印时是12;

7.词法分析与作用域链。
 如果函数嵌套时,每个函数都会再自己被调用时,产生自己的AO,这时,如果调用的方法中没有
 属性值,那么,就像外层找,一层一层的找,直到找到window对象。


8.详细说明Active Object对象。
 8.1看看下面的例子.
 function test(number){
  alert(number);
 }
 test(2);
 分析上面这个例子:
     第一步:分析,这属于词法分析里的哪种分析
     答:参数分析

     第二步:当test(2);这句话调用test()函数时,
       发生了什么。
                    答:产生了一个AO,并先进行参数分析,A0.number=undifine
         在这个函数的运行中,A0.number又被赋了新值A0.number=2
    第三步:结论  答案是32;

 8.2再来看看这个例子:
 function test2(number,age){
  alert(number);//9
  alert(age);//undifine
 }
 test2(9);
 这次你明白了吗??如果没太懂也没有关系,第一个number打印出9大家是明白的,但是age是undifine就不懂

了,是吧,这是因为 test2(9);当调用的一瞬间,AO的变化是这样的:
      第一步:  
       AO.number=undifine;
       AO.age=undifine;
      第二步将传入的参数赋值,
       AO.number=9;
      而注意看AO.age是不是还是undifine,这下明白了吧。

 8.3最后看一个吧!!
  function a(b){
  alert(b);
  function b(){
   alert(b);
  } 
    b();
 }
 a(1);
 这次的运行结果是什么??是两个function b(){alert(b)},你答对了吗???

 

  
 
  
      

转载于:https://www.cnblogs.com/songqiaoli/archive/2012/06/01/2529391.html

手把手教你构建JavaScript解释器 JavaScript解释器是处理和执行JavaScript代码的软件程序。它通过几个关键步骤把源代码转化为可以被浏览器或Node.js等运行环境执行的机器码或字节码。理解JavaScript解释器的工作流程是深入学习前端和全栈开发的基础。上下文无关文法(Context-Free Grammar,CFG)是形式文法的一种,它能够清晰地描述编程语言的语法结构。CFG由一系列产生式规则组成,每个规则定义了一种符号如何被替换为一系列其他符号。 阅读详情

相关推荐

javascript词法分析

挺不错的资源,简单明了,对于理解编译原理也有一定作用

浅谈JavaScript词法分析步骤

JavaScript代码运行前有一个类似编译的过程即词法分析词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数声明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active Object),简称AO 第一步:分析参数: 函数接收形式参数,添加到AO的属性,并且这个时候值为undefine,即AO.age=undefine 接收实参,添...

weixin_30786657的博客 306

学习javaScript必知必会(2)~js词法分析、介绍一下主流的浏览器的开发者工具(js调试和查看网络请求)

js词法分析、介绍一下主流的浏览器的开发者工具(js调试和查看网络请求)

伟庭的博客 3566

js词法分析

JavaScript代码运行前有一个类似编译的过程即词法分析词法分析主要有三个步骤:分析参数 再分析变量的声明 分析函数声明 具体步骤如下:函数在运行的瞬间,生成一个活动对象(Active Object),简称AO 第一步:分析参数: 函数接收形式参数,添加到AO的属性,并且这个时候值为undefine,即AO.age=undefine 接收实参,添加到AO的属性,覆盖之前的undef

吕秀军的博客 1044

JS词法分析

JS是弱类型语言,所谓弱类型只是表明该语言在表达式运算中不强制校验运算元的数据类型,而并不表明该语言是否具有类型系统。一般而言,JS的变量可从作用域角度分为全局变量和局部变量。 任何程序设计语言都有作用域(scope)的概念,简单来说,作用域就是变量与函数的可访问范围,也就是说,作用域控制着变量与函数的可见性和生命周期。换句话说,函数的变量有其作用域,也就是引用变量时在哪个范围内查...

JunChow 471

编译原理-词法分析实验(通过JavaScript 和 前端页面 巧妙实现)

由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式:(单词种别,单词自身的值) 我们对常量,变量,临时变量,保留关键字(if、while、begin、en

sinat_41393249的博客 421

javascript中的词法分析

词法分析 JavaScript中在调用函数的那一瞬间,会先进行词法分析词法分析的过程: 当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面: 1:函数参数,如果有,则将此参数赋值给AO,且值为undefined。如果没有,则不任何操作。2:函数局部变量,如果AO上有同名的值,则不任何操作。如果没有,则将此变量赋值给AO,并...

207

Js高级笔记

JS高级笔记

喜哥的博客 512

js 变量提升和函数提升原理

  关于js的变量,开始的时候我们都会被告知,变量声明应该在引用该变量之前。关于为什么要这样呢,开始的时候本着会用就行的目的,也没去深究。不过后来经常会发现一些让人很费解的。。姑且称为现象吧。先看一段代码再说: function a(){ alert(a); var a = 'b' } a();//undefined   此时就会发现不遵守规则的下场...

dianfenze8218的博客 89

JavaScript 代码美化利器:js-beautify 导入语句格式化完全指南

想要让杂乱的JavaScript代码变得整洁有序?js-beautify正是您需要的终极代码美化工具!这个强大的开源项目专门用于格式化JavaScript、CSS和HTML代码,其中对**导入语句排序格式化**的处理尤为出色。本文将为您详细介绍js-beautify如何通过静态分析技术实现导入语句的智能排序和美化。✨ ## 什么是js-beautify导入语句格式化? js-beautify是

gitblog_01042的博客 322

js执行过程(VO\GO\AO等)+闭包原理

很早之前写的js执行

weixin_51446872的博客 883

JS中的预编译(词法分析)阶段和执行阶段

javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行 预编译>执行),了解javascript引擎的执行机理,将有助于在写js代码过程中的思路总结 首...

weixin_30408309的博客 128

燕十八老师 JS高级学习笔记 之作用域链

javascript学习笔记之作用域链

pyzx19891212的博客 166

js词法分析

1.概念var str1 = 'global'; function t1(){ console.log(str1);//global console.log(str2);//undefinde var str2 = 'local'; }t1(); 注: js 代码自上而下执行: js代码在整体运行分: 1.词法分析期: 2.运行期: 自上而下执行之前,先有一个词

小鱼儿 1933

函数预解析补充

预解析: 所有的变量声明,都会提升到最顶部,但不会提升赋值 所有的函数声明,都会提升到最顶部,但不会提升函数的调用 如果同时有多个 var 声明的相同的变量,后面的 var 将被忽略 如果同时有多个同名的函数,后面的函数将会覆盖前面的函数 如果声明的变量和声明的函数同名,声明的函数将会覆盖声明的变量 词法分析3步骤: 先分析函数...

weixin_30830327的博客 81

浏览器解析JavaScript原理

浏览器解析JavaScript原理特点:1.跨平台 2.弱类型 javascript 定义的时候不需要定义数据类型,数据类型是根据变量值来确定的 var a = 10; 数字类型 var a = true boolean类型 强类型: 定义变量的时候需要定义变量的类型:例如java...

weixin_30295091的博客 117

(一)编译器+引擎+作用域的关系

文章目录要知道的传统编译语言的流程分词/词法分析解析/语法分析代码生成js引擎中的编译器三个搭档引擎编译器作用域var a = 2 发生了什么编译器的小术语 要知道的 我们通常将JavaScript归类为“动态”或“解释执行”语言,但事实上它是一门编译语言 与传统的编译语言不同,js不是提前编译的,编译结果也不可以在分布式系统中进行移植,尽管如此,js引擎进行编译的步骤和传统的编译语言还是非常的相似,但他在某些环节可能会更复杂 传统编译语言的流程 在传统编译语言的流程中,如果程序中的一段源代码需要执行,

qq_43952245的博客 683

关于js词法分析

JavaScript代码运行前有一个类似编译的过程即词法分析词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数声明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active Object),简称AO 第一步:分析参数: 函数接收形式参数,添加到AO的属性,并且这个时候值为undefine,即AO.age=undefine 接收实参...

weixin_30326745的博客 62

Vuejs设计与实现9-编译器核心

编译器相关内容介绍

delete_you的博客 656
上一篇: 能力是被逼出来的!!有压力才有动力
下一篇: js中绑定事件的三种方式
agg1111
博客等级 码龄12年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值