ao

学习Spring(九) -- Spring使用AOP

二次信任 提交于 2020-04-06 22:04:09
AOP通知 Spring中常用的AOP通知有五种: 前置通知:在某方法调用之前执行; 后置通知:在后方法调用之后执行; 异常通知:在某方法发生异常时执行; 返回通知:在某方法进行返回时执行; 环绕通知:可手动进行控制以上四种通知的执行; AOP配置 加入一下spring的jar包: 配置文件中引入xmlns:aop,加入<aop:aspectj-autoproxy></aop:aspectj-autoproxy>,具体配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xsi

Javascript 的词法分析

随声附和 提交于 2020-04-01 19:52:50
Javascript 的词法分析 过程: 1、先分析参数 2、再分析变量声明 3、分析函数声明 具体步骤: 1、函数运行前的瞬间,生成 Active Object (AO) 2、   2.1 函数声明的参数,形成AO的属性,值全部是 undefined   2.2 接受参数,形成AO相应的属性值 3、分析变量声明,如 var arg,   如果AO上还没有这个arg的属性,则添加AO属性,值是undefined   如果AO上已经有arg这个属性,则不做任何影响 4、分析函数声明,如 function foo(){},   则把函数赋给 AO.foo属性   注:如果此前foo属性已经存在,则被覆盖掉 例子: function test(a){ var a = 'hello'; alert(a); function a(){ } alert(a); } test(null); //两次输出 hello 分析过程: 1、AO= {} 2、分析参数AO={a:undefined},赋值 AO={a:null} 3、分析a变量声明,AO已经有a属性,因此不影响 4、分析a函数声明,AO.a=function(){},被覆盖成函数 来源: https://www.cnblogs.com/timily/p/3735276.html

深入理解JavaScript系列(12):变量对象(Variable Object)

↘锁芯ラ 提交于 2020-03-14 04:27:39
介绍 JavaScript编程的时候总避免不了声明函数和变量,以成功构建我们的系统,但是解释器是如何并且在什么地方去查找这些函数和变量呢?我们引用这些对象的时候究竟发生了什么? 原始发布:Dmitry A. Soshnikov 发布时间:2009-06-27 俄文地址:http://dmitrysoshnikov.com/ecmascript/ru-chapter-2-variable-object/ 英文翻译:Dmitry A. Soshnikov 发布时间:2010-03-15 英文地址:http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/ 部分难以翻译的句子参考了justinw的中文翻译 大多数ECMAScript程序员应该都知道变量与执行上下文有密切关系: var a = 10; // 全局上下文中的变量 (function () { var b = 20; // function上下文中的局部变量 })(); alert(a); // 10 alert(b); // 全局变量 "b" 没有声明 并且,很多程序员也都知道,当前ECMAScript规范指出独立作用域只能通过“函数(function)”代码类型的执行上下文创建。也就是说,相对于C/C++来说

js 闭包原理

☆樱花仙子☆ 提交于 2020-03-12 22:15:50
闭包的定义: 闭包是指有权访问另一个函数作用域中的变量的函数 -- 《JavaScript 高级程序设计》。 如何理解这句话:其实就是指 在函数a外面能够访问函数a里面的函数b 。 例如: 1 function a () { 2 var v = 123; 3 function b() { 4 console.log(v); 5 } 6 return b; 7 } 8 9 var b = a(); 10 b(); // 123 执行函数a时把函数b返回,此时函数b就保存到了a的外面,这时候就可以在a函数的外部对b进行访问。 相关知识点: js作用域链 执行原理: 1、首先在预编译全局代码时,生成GO   GO {     a: function a() {...},     b: undefined   } 2、执行 var b = a(); 此时对a函数进行预编译并创建a 函数的AO   AO {     v: undefined,     a: undefined,     b: function b() {...}   } 3、创建a函数的作用域链   a.[[Scopes]] = [AO, GO]; 4、由于函数的提升,会在a函数进行预编译的时候创建b函数的AO   b AO {}   b.[[Scopes]] = [AO(b), AO(a), GO] 5、执行 var v

前端之javascript

心不动则不痛 提交于 2020-03-05 00:06:58
JavaScript 是属于网络的脚本语言! JavaScript 被数百万计的网页用来改进设计、验证表单、检测浏览器、创建cookies,以及更多的应用。 JavaScript 是因特网上最流行的脚本语言。 JavaScript 很容易使用!你一定会喜欢它的 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客户端执行的语言)。 Netscape(网景)接收Nombas的理念,( Brendan Eich) 在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言。Sun和Netscape共同完成,后改名叫JavaScript。 微软随后模仿在其IE3.0的产品中搭载了一个JavaScript的克隆版叫Jscript。 为了统一三家,ECMA( 欧洲计算机制造协会)定义了ECMA-262规范.国际标准化组织及国际电工委员会(ISO/IEC)也采纳 ECMAScript 作为标准(ISO/IEC-16262)。从此,Web 浏览器就开始努力(虽然有着不同的程度的成功和失败)将 ECMAScript 作为 JavaScript 实现的基础。 ECMA-262 是 JavaScript 标准的官方名称。 ECMAScript

js 预编译

落花浮王杯 提交于 2020-02-27 15:02:42
js 运行代码的时候分为几个步骤: 语法分析 ==》 预编译 ==》 解释执行 语法解析: 通篇扫描代码,查看语法是否出错 解释执行 : 读一行 - 解释一行 - 执行一行 预编译执行的操作: // 假设之前并没有定义a console.log(a); 打印结果: Uncaught ReferenceError: a is not defined 这个大家应该都知道: 在变量未定义时就对变量进行访问就会报错(typeof 列外) 再看一个例子: 1 // 假设之前并没有定义变量a 2 console.log(a); 3 4 var a = 123; 5 6 console.log(a); 看上面代码会打印什么?会不会报错? 打印结果: undefined 123 为什么这个没有报错:因为在预编译的时候对变量进行了提升即 变量提升。 定义的变量的声明(var a ;)被提到了代码块的最前面,变量的赋值操作(a = 123)没有变化。 所以被编译后就相当于 1 // 假设之前没有定义变量a 2 var a; 3 4 console.log(a); 5 6 a = 123; 7 8 console.log(a); 看下面这个例子: 1 // 假设之前没有定义test 2 console.log(test); 3 4 var test = 123; 5 6 function test ()

预编译

自闭症网瘾萝莉.ら 提交于 2020-02-18 07:02:21
javascript预编译部分   JavaScript当中不向其他的语言一样,在js中我们会看到一些奇怪的现象就像我们可以在函数声明之前去访问这个函数的名字,并且能够打印出函数体,而且我们还能在变量声明之前去访问这个变量,虽然值是一个undefined但是并没有报错,这些特殊的情况,归结于函数的预编译过程。 console.log(foo); function foo(){}   这样的一段代码,根据javascript解释执行的情况,本应该是报错的,因为找不到函数的啊。但是这里的并没有报错,这里打印出来的是整个函数体。同样这样的情况还有我们可以在变量声明之前访问该变量,这种情况被总结为,函数声明整体提升,变量声明声明提升,提升的场所是整个作用域逻辑的最顶端。 两个不一样的全局变量   1. 暗示全局变量(imply global): 当一个变量未经声明就赋值的时候他就被当作是全局变量, 归window所有。 function foo() { var a = b = 123; } foo(); console.log(b); //123   这里的b就成了暗示全局变量,使得我们在函数的外部能够访问到。   2. 一切声明在全局当中的变量都是window对象的属性 var a = 123; console.log(window.a); // 123   它们的区别是

js预编译

人走茶凉 提交于 2020-02-12 08:14:01
我们都知道js执行遵循两个规则 1.函数声明整体提升 2.变量 声明提升 其实还有一点最重要的就是预编译,预编译往往发生在函数执行前,了解预编译,对我们理解函数执行非常关键。 预编译的前奏 1.imply global暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局属性所有。 2.一切声明的全局变量,全是window的属性。 下面就先看几个例子吧 例1 function fn(a){   console.log(a);   var a = 123; console.log(a);   function a(){};   console.log(a);   var b = function(){};//这是函数表达式,不是函数声明(var b属于变量声明)   console.log(b);   function d(){} } fn(1); 1.创建AO对象 AO{ } 2.查找函数形参及函数内变量声明,形参名及变量名作为AO对象的属性,值为undefined AO{   a:undefined;   b : undefined; } 3. 实参形参相统一,实参值赋给形参 (即把实参的值赋给形参,并不执行函数内的赋值) AO{   a:1;   b : undefined; } 4. 查找函数声明,函数名作为AO对象的属性,值为函数体 AO{    a

JS预编译

白昼怎懂夜的黑 提交于 2020-02-10 23:10:19
JS预编译 js运行三部曲 语法分析 预编译 解释执行 ** 预编译 ** 预编译发生在函数执行前的一刻。 简单现象:函数声明整体提升, 变量 声明提升(定义赋值不提升) ** 预编译过程(四部曲):** 1.创建AO对象(Activated Object)(执行期上下文) 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined。 3.将实参值和形参统一。 4.在函数体里面找函数声明,值赋予函数体。 function fn(a){ console.log(a); var a =123; console.log(a); function a(){}; console.log(a); var b = function(){}; console.log(b); function d(){}; } fn(1); //解析 一、预编译过程: 1.创建AO对象,找形参和变量声明,将变量和形参名作为AO属性名,值设置为undefined。 AO{ a:undefined, b:undefined, } 2.形参和实参统一 AO{ a:1, b:undefined, } 3.找函数声明,值赋予函数体 AO{ a:function a(){}, b:undefined, d:function d(){}; } 二、执行过程 1.第一个console.log(a):function

变量对象VO与活动对象AO

元气小坏坏 提交于 2020-02-09 15:43:07
变量对象VO 变量对象VO是与执行上下文相关的特殊对象,用来存储上下文的函数声明,函数形参和变量。在global全局上下文中,变量对象也是全局对象自身,在函数上下文中,变量对象被表示为活动对象AO。 变量对象VO存储上下文中声明的以下内容 { 函数声明FD(如果在函数上下文中),—-不包含函数表达式 函数形参function arguments, 变量声明–注意b=10不是变量,但是var b = 10;是变量,有变量声明提升 var a = 10; function test(x) { var b = 20; }; test(30); // 全局上下文的变量对象 VO(globalContext) = { a: 10, test: <reference to function> }; // test函数上下文的变量对象 VO(test functionContext) = { x: 30, b: 20 };   变量对象VO分类 全局上下文的变量对象VO,函数上下文的变量对象VO。 //全局上下文的变量对象VO就是全局对象GlobalContextVO VO(globalContext) === global; (VO === this === global) 函数上下文变量对象FunctionContextVO   (VO === AO, 并且添加了<arguments>