JavaScript:词法分析、连续赋值猜想

原创文章,转摘请注明出处:苏福:http://www.cnblogs.com/susufufu/p/5851642.html

深夜发文,先吐槽下博客园的编辑器,真不方便!我都是本地编辑好了在粘过来的,要是不用MarkDown写的话,那每次都得改改改啊!

先说下这个老话题:连续赋值

例1:

  1. function a(){
  2. var o1 = o2 = 5;
  3. }
  4. a();
  5. console.log(o1);
  6. console.log(o2);

结果是什么?console.log(o1);这句简单undefined,而console.log(o2);这句呢?答案是5,o2变成了全局变量了

这是实际执行顺序:

  1. var o1;
  2. o2 = 5; //o2未使用var声明,所以变全局变量了
  3. o1 = o2;

例2:

  1. var foo = {n:1};
  2. var bar = foo;
  3. foo.x = foo = {n:2};
  4. console.log(foo.x);
  5. console.log(bar.x);

很早以前的面试题目了,相信很多人知道答案,考点:词法分析、执行顺序、运算符优先级等

这是我理解的实际执行顺序:

  1. var foo;
  2. var bar;
  3. foo = {n:1};
  4. bar = foo; //bar = {n:1}
  5. foo.x = undefined; //
  6. foo.x = (foo = {n:2});
  7. console.log(foo.x); //undefined
  8. console.log(bar.x); //{ n: 2 }

我是这么猜想的:自我感觉勉强说的通,有不对的地方请指出!

JS引擎遇foo.x = foo = {n:2}; 词法分析为foo.x, =, foo, =, {n:2}

执行顺序:

1. 先为foo添加x属性,未赋值(undefined),这里的foo还是{n:1}

2. 遇到第一个'=',准备为x赋值

3. '='优先级最低,先计算右边表达式的值

4. 执行foo = {n:1},并将结果赋值给x

最终foo的引用指向了{n:2}

而bar的引用没变,始终指向原来的{n:1},而{n:1}被添加了x属性{n:2}变为{n:1,x:{n:2}},这就是最后bar引用的值

下面给大家介绍下JS的词法分析,参考自《javascript权威指南》《你不知道的javascript》

JavaScript代码自上而下执行,但是在js代码执行前,会首先进行词法分析,所以事实上,js运行要分为词法分析和执行两个阶段。

词法分析

词法分析主要分为3步:

第1步:分析形参

第2步:分析变量声明

第3步:分析函数声明

如果存在函数嵌套,则从外往内进行词法分析

具体步骤:

  1. 在函数执行的一瞬间,产生一个空的 Active Object(活动对象),下面简称AO
  2. AO对象初始化

    2.1 函数声明的形参,形成AO的属性,默认值是undefined,

    2.2 接收实参,给刚刚形成AO的属性的形参赋值
  3. var声明、函数声明均被提升到函数体顶部(若var声明、函数声明同名,则函数声明将覆盖变量声明),注意,var声明只提前了声明部分,而函数声明提前了整个函数定义。
  4. 分析var声明变量!如 var age;(变量的值是在运行时期决定)

    4.1 如果AO上没有age属性,则给AO添加age属性,默认值是undefined

    4.2 如果AO上有age属性,则不做任何操作。
  5. 分析函数声明!如 function foot(){}

    51 如果AO上没有foot属性,则把函数赋给AO.foot属性

    5.2 如果AO上有foot属性,则会直接覆盖,把函数赋给AO.foot属性(因为:若var声明、函数声明同名,则函数声明将覆盖变量声明)
  6. 依据此时AO的值,自上而下执行代码

代码演示与分析:

  1. function a(b){
  2. alert(b);
  3. function b(){
  4. alert(b);
  5. }
  6. b();
  7. }
  8. a(1);

这是个常见的面试题,如果不懂JavaScript的词法分析,根本看不懂,下面就按照JavaScript的词法步骤进行分析,前面说过JavaScript自上而下执行,但是先进行词法分析后执行代码

分析过程:

  1. 形成活动对象AO={}
  2. 分析形参,--> AO={b:undefined}; 分析传参,--> AO={b:1}
  3. 分析变量声明var,没有
  4. 分析函数声明,AO.b=function(){alert(b);},执行覆盖操作

执行过程:

alert(b);//function

b(); // 执行function b...alert(b),在函数b的作用域内部找不到b,根据作用域链原理往外层寻找,找到b就是函数自己,打印出function ...

深入JavaScript:词法分析、连续赋值猜想的更多相关文章

  1. javascript --- 词法分析

    JavaScript代码自上而下执行,但是在js代码执行前,会首先进行词法分析,所以事实上,js运行要分为词法分析和执行两个阶段. 词法分析主要分为三步: 第一步: 分析形参: 第二步: 分析变量声明 ...

  2. 浅谈JavaScript词法分析步骤

    JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数声明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active Ob ...

  3. 前端开发 - JavaScript 词法分析

    JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 1.分析函数的参数 2.分析函数的变量声明 3.分析函数的函数声明表达式 具体步骤如下: 函数在运行的瞬间,生成 ...

  4. JavaScript词法分析(尽力理解)

    JavaScript中在调用函数的那一瞬间之前,会先进行词法分析 词法分析的过程: 当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面: 1:函数参数 ...

  5. Javascript词法分析

    词法分析的过程: 先分析参数 分析变量声明 分析函数声明 具体步骤: 在函数运行前的一瞬间,先生成Active Object活动对象; 函数声明的参数,形成AO的属性,值为undefined 接收参数 ...

  6. JavaScript的连续赋值的思考

    下面是一个连续赋值的例子: 在这里面,先创建a对象并添加n:1,然后将a对象赋值给b,这时候a和b引用同一个对象.最后我们要着重理解这最后一行代码 a.x = a = {n:2}; 按照我们平常的思维 ...

  7. JavaScript词法分析解析

    函数在调用之前,会进行词法分析或者叫语法分析: 1. 函数在形成调用的那一瞬间,会有一个活动对象叫 active object ,简称AO,会分析如下几条: 形式参数 函数内局部变量声明 函数声明表达 ...

  8. 理解javascript中的连续赋值

    之前在扒源码时经常看到类似的连续赋值操作:  var a = b = 1;  在某度搜了众多前辈的博客,总算对这骚操作有点眉目. Case analysis 首先,javascript中连续赋值最典型 ...

  9. 前端——JavaScript

    何谓JavaScript?它与Java有什么关系? JavaScript与HTML.CSS组合使用应用于前端开发,JavaScript是一门独立的语言,浏览器内置了JS的解释器.它除了和Java名字长 ...

随机推荐

  1. Ucos系统任务间的通信详解

    物联网开发中,ucos系统任务间的通信是指,两个任务之间有数据的交互,具体的一起来看看吧. 1)消息邮箱 我们还是提供两个任务Task1和Task2,假设我们还是解决刚刚的问题,Task1进行按键扫描 ...

  2. 应用程序框架实战十一:创建VS解决方案与程序集

    上一篇,介绍了开发环境需要的工具和版本,本篇将动手创建VS解决方案. 对于本系列文章提供的示例,我想通过两种途径来演示,一种是单元测试,另外为了能更直观的看到效果,还会提供一个用户界面来展示.为了不分 ...

  3. Java 8新特性-4 方法引用

    对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMetho ...

  4. innerHTML与innerText的异同

    在一道面试题中看到的. 1.功能讲解: innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 innerText 设置或获取 ...

  5. sublime3破解版sublime3注册码

    Sublime Text 3 官方网址:http://www.sublimetext.com/ Mac下载地址: http://c758482.r82.cf2.rackcdn.com/Sublime% ...

  6. C# 打印PDF文件之使用不同打印机打印所有页面或部分页面

    C# 打印PDF文件之使用不同打印机打印所有页面或部分页面 最近在逛国外各大编程社区论坛的时候,发现很多人都在问一个关于PDF文件打印的问题:打印时如何选择非默认打印机并设置打印页面的范围.而一般情况 ...

  7. 分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。

    (转载声明出处:http://www.cnblogs.com/linguanh/) 简介:      该ListView 实现动态加载数据,为了方便用户充分地自定义自己的数据源.点击事件,等核心操作, ...

  8. Oracle内存管理技术

    1.Oracle内存管理技术 2.配置自动内存管理(AMM) 3.监视自动内存管理(AMM) 4.配置自动共享内存管理(ASMM) 5.配置自动PGA内存管理 Reference 1.Oracle内存 ...

  9. ASP.NET实现微信功能(2)(服务号高级群发)

    前面写了一篇文章,关于微信的:http://www.cnblogs.com/kmsfan/p/4047097.html 今天打算来写本系列的第二批文章,服务号后台群发. 在写本篇文章之前,我们先来看看 ...

  10. 常见的几个meta标签元素

    1.指定字符集: <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/& ...