——杨沫 之前一直有朋友问我Java中DTO、TO、VO、PO、DO、BO、AO、DAO、POJO这么多O到底是什么意思,看博客看不懂,有没有实际的例子 当然,这些O是出自《阿里Java开发手册》...POJO(Plain Ordinary Java Object): 在本规约中,POJO 专指只有 setter/getter/toString 的 简单类,包括 DO/DTO/BO/VO 等。...AO(Application Object): 阿里巴巴专指 Application Object,即在 Service 层上,极为贴近 业务的复用代码。...(Application Object) AO在我认为就是service层的这个类,例如UserService就是一个AO **DAO(Data Access Object)**对应上面的Mapper,...这就是我对DTO、TO、VO、PO、DO、BO、AO、DAO、POJO的理解了 其实在不同的公司,不同的技术经理会定好,或者公司内部有相关文档等,这上面也只是我当前公司沿用的,仅供参考,如有争议也欢迎与我探讨
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。...AO( Application Object):应用对象,在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
一、引言 DO、DTO、BO、AO、VO、POJO的概念看似简单,但是想区分好或者理解好也不容易,本文简单梳理一下。 通过各层POJO的使用,有助于提高代码的可读性和可维护性。...AO(ApplicationObject):应用对象,在Web层与Service层之间抽象的复用对象模型, 极为贴近展示层,复用度不高。 ...VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。 Query:数据查询对象,各层接收上层的查询请求。...---------------------- 大致的示例代码: Controller层 public List getUsers(UserQuery userQuery); 此层常见的转换为:DTO转VO
AO( Application Object):应用对象。 在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。...VO( View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。...POJO( Plain Ordinary Java Object):在本手册中, POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO等。...POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。
想要了解JS底层运行机制,首先要明白这几个概念: 为什么js能在浏览器中执行 众所周知,计算机是有内存的,计算机会在内存中开辟一块空间去供js执行,这个空间我们称之为执行栈 全局对象和全局变量对象是一样的吗...全局变量对象,在script标签内的代码执行时,会形成EC(G)的栈,EC(G)进栈(执行环境栈,EC Stack)执行,形成全局执行上下文(VO(G)),供给下级作用域 js中上下文有哪些 全局上下文...(全局代码执行形成),记录为VO 私有上下文(函数执行形成),记录为AO 块级私有上下文 .......,这时候会放到自己作用域的顶端 scope chain[0] --> AO [1]--> GO 函数在查找变量时,遵从作用域链顶端自顶而下查找 EC/AO/VO/GO EC(Execution call...--> VO(G) [scope]: VO(G), scope.chain: , AO(A) : {
知其然不知其所以然,在好奇心的驱使下,从 with 出发,一路追溯到 VO、AO。那么先来复习一下 with 是干嘛的吧。...AO 在函数 EC 中,VO 是不能直接访问的,此时由激活对象(Activation Object,AO)来替代 VO 的角色。...AO 是在进入函数 EC 时被创建的,它通过函数的 arguments 进行初始化。这时,VO === AO。...作用域链 了解了 EC、AO、VO,再来看作用域链 var x = 10; function foo() { var y = 20; function bar() {...(VO/AO + All Parent VO/AOs) 理解了查找过程,很容易想到 js 中的原型链,而作用域链和原型链则可以组合成一个二维查找:先通过作用域链查找到某个对象,再查找这个对象上的属性。
3.关键点划分 这么多的概念,在JS编译执行过程中,很容易让大家绕晕。但其实,只要把握住整个JS编译执行的关键点,一切困难都会迎刃而解。那么这个关键点是什么呢?其实就是函数执行。...to function checkscope }, Scope: [globalContext.VO], this: globalContext.VO } checkScope...undefined, f: reference to function f(){} }, Scope: [AO, globalContext.VO], this:...[[scope]] = [ checkscopeContext.AO, globalContext.VO ]; checkscopeContext = { AO: {...参考 JS入门难点解析3-作用域 JS入门难点解析4-执行上下文栈 JS入门难点解析5-变量对象 JS入门难点解析6-作用域链 JS入门难点解析7-this 一道js面试题引发的思考 JavaScript
当执行 JS 代码时,会产生三种执行上下文 全局执行上下文 函数执行上下文 eval 执行上下文 每个执行上下文中都有三个重要的属性 变量对象(VO),包含变量、函数声明和函数的形参,该属性只能在全局上下文中访问...作用域链(JS 采用词法作用域,也就是说变量的作用域是在定义时就决定了) this var a = 10 function foo(i) { var b = 20 } foo() 对于上述代码,执行栈中有两个上下文...= { a: undefined, foo: , } 对于函数 foo 来说,VO 不能访问,只能访问到活动对象(AO) fooContext.VO === foo.AO...fooContext.AO { i: undefined, b: undefined, arguments: } // arguments 是函数独有的对象(箭头函数没有)...第一个阶段是创建的阶段(具体步骤是创建 VO),JS 解释器会找出需要提升的变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined,所以在第二个阶段
比如执行 B 函数,那 B 的链表看起来就是 AO(B) --> AO(A) 同时,A 函数也是有自己的链表的,为 AO(A) --> VO(G) 。...所以整个链表就串起来来,B 的链表(作用域)就是:AO(B) --> AO(A) --> VO(G) 链表是一个闭环,因为查了一圈,回到自己的时候,如果还没找到,那就返回 undefined 。...继续分享, kun 函数的作用域链如下: AO(kun) --> VO(G) 而且 kun 函数已经从栈顶被删除了,只留下 AO(kun) 。 注意:这里的 AO(kun) 表示一个节点。...那么 ,result 数组中每一个函数其作用域链如下: AO(result[i]) --> AO(kun) --> VO(G) 因此 result 中的每一个函数执行时,其 i 的值都是沿着这条作用域链去查找的...result[9] 函数的父执行环境是 EC(kun) ,这个 VO(kun) 里面的 i 值 是 9 。 记住 AO(kun) 是一段存储空间。
简介 在JS入门难点解析5-变量对象中提到,对于每个执行上下文,都有三个重要属性: 变量对象(Variable object,VO) 作用域链(Scope chain) this 这篇文章主要讲解作用域链...[[scope]] = [ globalContext.VO ]; bar....[[scope]] = [ fooContext.AO, globalContext.VO ]; 4....函数激活 当函数激活时,进入函数上下文,创建 VO/AO 后,就会将活动对象添加到作用链的前端。...js 中的活动对象 与 变量对象 什么区别? BOOK-《JavaScript高级程序设计(第3版)》
上一节我们讨论了执行上下文,那么在上下文中到底有什么内容,为什么它会和作用域链扯上关系,JS 解释器又是怎么找到我们声明的函数和变量,看完这一节,相信大家就不会再迷惑了。...代码执行 在这个阶段,AO/VO 已经有了属性(并不是所有的属性都有值,大部分属性的值还是系统默认的初始值 undefined)。...d 上面,所以变量 d 仍然存在于 VO/AO 中。...所以,在进入执行上下文时,AO/VO 结构如下: AO = { x: // 在碰到变量声明 x 时,因为已经存在了函数声明...x ,所以会忽略 } 紧接着,在代码执行阶段,AO/VO 被修改如下: AO['x'] = 10; AO['x'] = 20; 希望大家可以好好理解变量对象,对于理解我们后边要讲的作用域链有很大的帮助
而代码的类型分三种: 全局代码 函数代码 eval()执行的代码 最后一种不讨论,全局代码就是指写在函数外的代码,在前端里,当 HTML 加载一个 js 文件时,全局代码就会被执行,那么在全局代码执行前就会先创建一个全局的执行上下文...所以执行 js 文件代码期间,这个栈底一直是全局执行上下文,直到 js 文件代码执行结束。全局代码执行过程中,每调用一次函数,新创建一个函数执行上下文,就放入栈内。...对于全局执行上下文,当 HTML 加载一个 js 文件时,就会创建一个全局 EC,此时会创建它的两个属性:变量对象和作用域链。...针对函数执行上下文,为了保存这些变量,特意创建了一个对象,称它为活动对象 AO,函数内所需的变量就都保存在 AO 中,所以在函数执行上下文中,变量对象 VO 的具体表现也就是 AO。...在函数执行上下文中,由于要保存函数形参、局部变量、自身函数对象引用变量、arguments、this,所以新创建了一个叫活动对象 AO 来保存,此时 VO 的具体实现就是 AO。
所以,如果有些信息需要跨 js 文件通信,此时要么通过全局对象方式,要么通过闭包特性来辅助实现。...在全局执行上下文中,VO 的具体表现是全局对象;在函数执行上下文中,VO 的具体表现是 AO,AO 存储着函数内的变量:形参、局部变量、函数自身引用、this、arguments。...也就是说,在执行代码阶段,代码实际运行时,js 解释器已经解析了一遍上下文内的代码,并创建了执行上下文,且为其添加了一个 VO 属性,在 VO 对象上添加了上下文内声明的所有变量,这就是变量的声明提前行为...当实际开始执行第一行全局代码时,js解释器经过了解析阶段已经做了如上的工作,得到了一些基本的信息。...AO 就是变量对象 VO 在函数执行上下文中的具体表现。
上一节我们讨论了执行上下文,那么在上下文中到底有什么内容,为什么它会和作用域链扯上关系,JS 解释器又是怎么找到我们声明的函数和变量,看完这一节,相信大家就不会再迷惑了。...代码执行 在这个阶段,AO/VO 已经有了属性(并不是所有的属性都有值,大部分属性的值还是系统默认的初始值 undefined)。..._d 已经保存到了声明的变量 d 上面,所以变量 d 仍然存在于 VO/AO 中。...所以,在进入执行上下文时,AO/VO 结构如下: AO = { x: // 在碰到变量声明 x 时,因为已经存在了函数声明...x ,所以会忽略 } 复制代码 紧接着,在代码执行阶段,AO/VO 被修改如下: AO['x'] = 10; AO['x'] = 20; 复制代码 希望大家可以好好理解变量对象,对于理解我们后边要讲的作用域链有很大的帮助
(Variable Object,变量对象),变量和函数声明会被添加到这个VO对象中,当全局代码被执行的时候,VO就是GO对象了 全局上下文三个关键: VO(go) 作用域链 This 执行以下代码过程...在执行的过程中执行到一个函数时,就会根据函数体创建一个函数执行上下文(Functional Execution Context,简称FEC),并且压入到EC Stack中 当进入一个函数执行上下文时,会创建一个AO...对象(Activation Object) 这个AO对象会使用arguments作为初始化,并且初始值是传入的参数 这个AO对象会作为执行上下文的VO来存放变量的初始化 如下函数执行过程 执行前...://img-blog.csdnimg.cn/img_convert/994bd5c4b704e04215dea09f2d428a5d.png 流程为: 执行前创建FEC 也就是函数执行上下文 创建 AO...中 之后调用foo() 在函数调用后找到GO中的n复制 函数结束,之后输出n 作用域链也是我们JS闭包的一个重点, js中闭包就是通过作用域链的方式来完成变量可以跨作用域访问的,为我们加快提升了开发的效率
简述 我们都知道无法通过delete关键字针对变量和函数进行操作,而对于显示的对象属性声明却可以进行,这个原因需要深究到js的实现层上去,让我们跟随 Understanding delete...,在全局上下文中VO就是全局对象window,在函数上下文中,VO也是活动地向AO,而在eval中的代码在执行时,其执行上下文也就是调用eval的上下文。 ...在上下文中定义的变量,函数声明以及函数的入参和AO特有的arguments对象等等,都属于VO(AO)的属性。...而对于未初始化的变量赋值,我们知道未初始化的变量默认为全局变量,VO的属性确定是在进入上下文阶段,因此未初始化变量并不会成为VO的属性,[[configurable]]仍未true,可以删除。...]]为true 删除宿主对象属性时需小心,可能有意外发生,取决于js引擎的具体实现
简介 闭包,是让很多JS初学者闻之色变的一个概念。每次看过一些书籍或者网上的例子,会感觉自己懂了很多,但又是似懂非懂。...}, Scope: [AO, globalContext.VO], this: undefined }; fContext = { AO = { arguments...: { length: 0 } }, Scope: [AO, fooContext.AO, globalContext.VO], this...Scope: [AO, fooContext.AO, globalContext.VO], this: undefined } fContext利用f的[[scope]]信息生成了作用域链Scope...: [AO, fooContext.AO, globalContext.VO]。
在函数创建阶段,JS解析引擎进行预解析,会将函数声明提前,同时将该函数放到全局作用域中或当前函数的上一级函数的局部作用域中。...04 - 什么是AO、VO 英文解释: AO:Activetion Object(活动对象) VO:Variable Object(变量对象) VO对应的是函数创建阶段,JS解析引擎进行预解析时,所有的变量和函数的声明...add(4,5); 例如,调用add后的作用域链是: //此时作用域链(Scope Chain)有两级,第一级为AO,然后Global Object(VO) scope(add) -> AO -> VO...AO = { this : window, arguments : [4,5], a : 4, b : 5, sum : undefined } VO = {...此时的作用域链为: //此时作用域链(Scope Chain)有三级,第一级为bar AO,第二级为foo AO,然后Global Object(VO) scope -> bar.AO -> foo.AO
每调用一次函数执行函数体时,js 解释器会经过两个阶段:解析阶段和执行阶段; 调用函数进入解析阶段时主要负责下面的工作: 创建函数上下文 创建变量对象 创建作用域链 创建变量对象的过程在作用域一节中讲过了...,主要就是解析函数体中的声明语句,创建一个活动对象 AO,并将函数的形参列表、局部变量、arguments、this、函数对象自身引用添加为活动对象 AO 的属性,以便函数体代码对这些变量的使用。...而创建作用域链的过程,主要做了两件事: 将当前函数执行上下文的 VO 放到链表头部 将函数的内部属性 [[Scope]] 存储的 VO 链表拼接到 VO 后面 ps:[[]] 表示 js 解释器为对象创建的内部属性...也就是说,在 c 函数内部代码执行之前,就为 c 函数的执行创建了 c 函数执行上下文 EC,这个过程中,会将形参变量,函数体声明的变量都添加到 AO 中(在函数执行上下文中,VO 的具体表现为 AO)...,将函数内声明的变量、形参、arguments、this、函数自身引用都添加到AO中 函数内对各变量的操作实际上是对上个步骤添加到 AO 对象内的这些属性的操作 创建执行上下文阶段中,还会创建上下文的另一个属性
思路是完美的,可是js的作者采用的静态作用域,不管你们怎么运行,你们 定义的时候作用域已经生成了。 那么什么是作用域? 变量和函数能被有效访问的区域或者集合。作用域决定了代码块之间的资源可访问性。...再来理解几个概念词: AO:活动变量(Active object,VO) VO:变量对象(Variable object,VO) 执行上下文:代码运行的环境,分为全局上下文和函数上下文。...当a函数被执行时,此时a函数对象的作用域[[scope]]的作用域链scope chain的第一项指向了AO(Activation Object)活动对象,AO对象里有4个属性,分别是this、arguments...当b函数被定义时,此时b函数对象的作用域[[scope]]的作用域链scope chain的第一项指向了AO(Activation Object)活动对象,AO对象里有4个属性,分别是this、arguments...第一项指向了AO(Activation Object)活动对象,AO对象里有4个属性,分别是this、arguments、a、b。
领取专属 10元无门槛券
手把手带您无忧上云