GO和AO

变量的预编译

实例1

console.log(a);
var a=1;
console.log(a);

实际编译过程:

将a存入预编译对象中,赋值为undefined;

真正的赋值语句当程序运行到时才会执行。

实例1等价:

var a=undefined;
console.log(a);//undefined
a=1;
console.log(a);//1

GO(Global Object)

预编译过程

先创建GO对象(Global Object),再创建AO对象(Activation Object)。

GO:先不看函数内部的代码

  1. 创建GO对象;
  2. 找 变量声明,将 变量 作为GO属性名,值为undefined;
  3. 再找 函数声明,值赋予函数体;

GO对象创建完成,开始读代码,直到读到全局调用test函数时,函数预编译,开始创建AO对象(预编译发生在函数执行的前一刻)

实例2

console.log(test); //function
function test(test) {
console.log(test);
var test = 234;
console.log(test);
function test() {}
}
test(1);
var test = 123;//test=123 覆盖属性test:function
console.log(test);//123
  1. 创建GO对象;

    GO { }
  2. 找 变量声明,将 变量 作为GO属性名,值为undefined;

    GO {
    test : undefined
    }
  3. 再找 函数声明,值赋予函数体;

    GO {
    test : function test(test) {
    // … 整个函数体 }
    }

    GO对象创建完成,开始读代码,直到读到全局调用test函数时,函数预编译,开始创建AO对象(预编译发生在函数执行的前一刻)


AO(activation object )

全称:活跃对象/执行期上下文,在函数执行前执行函数预编译,此时会产生一个AO对象,AO对象保存该函数的参数变量。

函数预编译步骤:

  1. 产生AO对象
  2. 将函数的形参和函数内声明的变量当作AO对象的属性名,值全为undefined。变量的赋值在原先的位置
  3. 将实参赋值给形参属性
  4. 在函数内声明的函数,函数名作为OA的属性名,函数体赋值给值。(若函数名和变量重名,函数体会覆盖原先的变量值)

实例3

function test(a) {
console.log(a);
var a = 2;
console.log(a);
function a () {}
console.log(a);
var b = function () {};
console.log(b);
function d(){}
}
test(1);

1. 创建AO对象

AO{
//此时AO对象为空
}

2. 确定AO对象的属性名

AO{
a:undefined; //函数参数
b:undefined; //函数里面声明的变量
}

3. 将实参值赋值给形参

AO{
a:1; //函数参数
b:undefined; //函数里面声明的变量
}

4. 处理函数里面的声明函数

var b=function( ){ };时不会把函数体给到b属性的。b仍然是undefined.

function a( ){ }; 才会覆盖a属性。

AO{
a:function a () {} //变量名一样,值覆盖
b:undefined, //函数里面声明的变量
d:function d () {}
}
function test(a) {
console.log(a);//function a;
var a = 2;//a=2; 覆盖AO中的属性值
console.log(a); //2;
function a () {} //预编译时已经处理过了,直接跳过
console.log(a); //2
console.log(b); //undefined; bs变量 尚未赋值
var b = function () {};//b=function(){}; 覆盖
console.log(b);//function (){};
function d(){}
}
test(1);

JS预编译过程的更多相关文章

  1. js预编译

    先来做三个测试 eg1: var a; a = 1; function a() {}; console.log(a); eg2: var a; function a() {}; console.log ...

  2. JS预编译详解

    我们都知道javascript是解释型语言,执行的特点呢是编译一行,执行一行.按照这个思路有时候我们在运行代码时会有一些令人费解的现象出现.下面我们一起来执行下面三段代码. <script> ...

  3. js 预编译

    js 运行代码的时候分为几个步骤:语法分析 ==>预编译  ==>解释执行 语法解析:通篇扫描代码,查看语法是否出错 解释执行:读一行 - 解释一行 - 执行一行 预编译执行的操作: // ...

  4. Handlebars.js 预编译(转)

    Handlebars.js 官网上对预编译1是这样说的: 你需要安装 Node.js 你需要在全局环境中,通过 Npm 安装 handlebars 包 然后你就可以通过命令预编译你的 handleba ...

  5. javaScript 预编译过程浅尝

    javaScript 预编译过程 1.创建AO对象(Activation Object) AO{ a: } 2.找形参和变量声明,将变量和形参作为AO属性名,值为undefined AO{ a:und ...

  6. 关于js预编译以及js文件执行顺序的几个问题。

    关于js的执行原理,除去html页面中直接添加的代码,js代码的放置可以分为两类. //情形a           <script type="text/javascript" ...

  7. js预编译和函数执行

    javascript 执行过程 1.语法检测(有没有基本的语法错误,例如中文,关键字错误...)2.词法分析(预编译) (1)创建全局GO(global object)对象 (2)对var声明的变量进 ...

  8. C语言的预编译,程序员必须懂的知识!【预编译指令】【预编译过程】

    由“源代码”到“可执行文件”的过程包括四个步骤:预编译.编译.汇编.链接.所以,首先就应该清楚的首要问题就是:预编译只是对程序的文本起作用,换句话说就是,预编译阶段仅仅对源代码的单词进行变换,而不是对 ...

  9. js预编译的四部曲

    众所周知javascript是解释性语言,主要特点为解释一行执行一行. 而在js运行时会进行三件事:1语法分析  2.预编译  3.解释执行 语法分析会在代码执行前对代码进行通篇检查,以排除一些低级错 ...

随机推荐

  1. 《手把手教你》系列技巧篇(十七)-java+ selenium自动化测试-元素定位大法之By css上卷(详细教程)

    1.简介 CSS定位方式和xpath定位方式基本相同,只是CSS定位表达式有其自己的格式.CSS定位方式拥有比xpath定位速度快,且比CSS稳定的特性.下面详细介绍CSS定位方式的使用方法.xpat ...

  2. Notes about BSD

    FreeBSD: mainly for web server; OpenBSD: mainly for security concerned server;

  3. ES6继承和ES5继承是完全一样的么?

    继承方式 ES5 prototype 继承 通过原型链(构造函数 + [[prototype]])指向实现继承. (备注:后续__proto__我都会写成[[prototype]]这种形式) 子类的 ...

  4. java8-stream常用操作(1)

    前言 java8的Stream 流式操作,用于对集合进行投影.转换.过滤.排序.去重等,更进一步地说,这些操作能链式串联在一起使用,类似于 SQL 语句,可以大大简化代码.下面我就将平时常用的一些st ...

  5. Python - typing 模块 —— NewType

    前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ...

  6. python 日期、时间处理,各种日期时间格式/字符串之间的相互转换究竟是怎样的?

    模块函数说明 ''' date 日期对象,常用的属性有year,month,day time 时间对象,常用的属性有hour,minute,second,毫秒 datetime 日期时间对象,常用的属 ...

  7. 盘点 HashMap 的实现原理及面试题

    1.请你谈谈 HashMap 的工作原理如果被问到 HashMap 相关的问题,它的工作原理都会被作为面试的开场白,这个时候先装作若有所思的样子冷静一下.首先 HashMap 是基于 hashing ...

  8. SpringBoot五步配置Mybatis

    第一步:Maven里面添加mybatis的引用jar包: <!--mybatis--> <dependency> <groupId>org.mybatis.spri ...

  9. 十一:JavaWeb中的监听器(二)

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  10. Java环境变量(Env)和系统属性(Property)详解

    环境变量Env 使用System.getenv()获取系统的所有环境变量的Map,注意它是一个UnmodifiableCollection,是一个只读视图 环境变量并不提供set方法,即没有Syste ...