给AOP的after函数使用原函数局部变量
引:AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
这里我们可以理解为在执行某函数时,要先执行什么,或最后执行什么。
比如:
function a() {
alert(1)
}
function b() {
alert(2)
} //如果要先打印1再打印2
a();
b();
//又或者把a()改为
function a(){
alert(1);
b();
}
第一种方法显得累赘,而且在改造升级的情况下,可能会使function b()没了,然后会报错,第二种方法代码入侵性太大。
我们可以使用AOP去改善这种逻辑。
关于实现和应用场景大家可以参考alloyteam,这文章(http://www.alloyteam.com/2013/08/yong-aop-gai-shan-javascript-dai-ma/)
现在这里讨论的是after函数如何使用原函数的局部变量。
就拿alloyteam代码做个例子。
AOP实现:
Function.prototype.before = function (func) {
var __self = this;
return function () {
if (func.apply(this, arguments) === false) {
return false;
}
return __self.apply(this, arguments);
}
} Function.prototype.after = function (func) {
var __self = this;
return function(){
var ret = __self.apply(this, arguments);
if (ret === false) {
return false;
}
func.apply(this, arguments);
return ret;
} }
那么刚才的例子可以写成这样:
var a = a.after(b);
a();
现在想要函数b可以用到函数a里面的一个变量,就要使函数a最后return 返回变量。
如果我们不想改变函数a,又或者函数a的第三方代码,那怎么办,改动起来无疑麻烦,这里我新建一个方法insertAfter,
虽然这个改造有入侵性,但我们可以选择性使用这个方法。
Function.prototype.insertAfter = function (func) {
var oldFuncStr = this.toString();
var aftFuncStr = func.toString();
oldFuncStr = oldFuncStr.replace(/^function(.*){/, '');
var newFuncStr = oldFuncStr.replace(/}$/, '~'+aftFuncStr+'()');
var newFunc = new Function ("", newFuncStr);
return newFunc;
}
这样,after进去的函数就可以使用原函数的局部变量了。
注意原函数有return的情况,就应该把after内容放在return前面,如果是return false,可以忽略了。这里只给出思路。希望读者可以自行改造。
下面给出完整例子:
Function.prototype.insertAfter = function (func) {
var oldFuncStr = this.toString();
var aftFuncStr = func.toString();
oldFuncStr = oldFuncStr.replace(/^function(.*){/, '');
var newFuncStr = oldFuncStr.replace(/}$/, '~'+aftFuncStr+'()');
var newFunc = new Function ("", newFuncStr);
return newFunc;
} //Usage
function a(){
var x = 123;
alert(1);
} function b(){
alert(x);
} var a = a.insertAfter(b);
a();
给AOP的after函数使用原函数局部变量的更多相关文章
- 第十二篇 Python函数之全局变量&局部变量&递归函数
全局变量:在定义的时候,顶头写的,没有任何缩进的变量就是全局变量. 全局变量的特点:在当前文件里的任何地方都可以进行调用 局部变量:在子程序里定义的变量,就是局部变量. 子程序:比如.py文件里,写的 ...
- Python新手学习基础之函数-全局变量和局部变量
全局变量和局部变量 我们通常把定义在函数外的变量成为全局变量,定义在函数内的变量称为局部变量,顾名思义,全局变量的作用域是整个代码段,局部变量的作用域就只是在它所属的代码段,变量只在它的作用域里有效. ...
- JS模式--装饰者模式(用AOP动态改变函数的参数)
Function.prototype.before = function (beforefn) { var _self = this; return function () { beforefn.ap ...
- Python自动化--语言基础3--字典、函数、全局/局部变量
字典 dict1 = {'name':'han','age':18,'class':'first'} print(dict1.keys()) #打印所有的key值 print(dict1.values ...
- c c++ 函数不要返回局部变量的指针
结论:普通的变量(非new的变量)都是系统自动分配的,在栈空间(连续分配),无需程序员操作,速度快,但是...空间有限,不适合大量数据,大量的话就需要自己new new出来的变量是处于大容量的堆空间, ...
- 【逆向工具】IDA使用2-VS2015版本release查找main函数入口,局部变量
VS2015版本release查找main函数入口 vc++开发的程序main或WinMain函数是语法规定的用户入口,而不是应用程序入口.入口代码是mainCRTstartup.wmainCRTSt ...
- Python3基础 global 使函数中的局部变量升格为全局变量
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- C指针函数中的局部变量返回
所谓指针函数其实就是 :一个函数的返回值为指针. 指针函数定义:返回类型标识符* 函数名(形参列表){函数体} eg: int* fun1(int n){} 指针函数和局部变量返回解析: 简 ...
- Python3基础(3)集合、文件操作、字符转编码、函数、全局/局部变量、递归、函数式编程、高阶函数
---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...
随机推荐
- JAVA设计模式之不变模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述不变(Immutable)模式的: 一个对象的状态在对象被创建之后就不再变化,这就是所谓的不变模式. 不变模式的结构 不变模式可增强对象的 ...
- Android 实现多行文本跑马灯效果
Android TextView 实现跑马灯的效果很简单,只要加三个属性就可以了. android:ellipsize="marquee" android:focusable=&q ...
- ORACLE 常用函数 日期/时间函数
---------------------------------------------日期/时间函数----------------------------------------------- ...
- C# 远程网络唤醒介绍及代码
一.定义 网络唤醒:唤醒休眠状态下的计算机,而不是已关机的计算机. 优势:可通过定时功能实现自动唤醒计算机,减少人力使用. 实现方法:通过被唤醒机的MAC地址进行广播发送请求,唤醒计算机. 二.硬件设 ...
- php关闭错误提示
今天调试phalcon的一个接口时候碰到如下提示: Deprecated: mongogo::mongogo(): The Mongo class is deprecated, please use ...
- IBindCtx接口定义
IBindCtx接口定义
- Net分布式系统之二:CentOS系统搭建Nginx负载均衡(下)
上一篇文章介绍了VMWare12虚拟机.Linux(CentOS7)系统安装.部署Nginx1.6.3代理服务做负载均衡.接下来介绍通过Nginx将请求分发到各web应用处理服务. 一.Web应用开发 ...
- codeforces731C Socks
C. Socks time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- signtool.exe not found
When check the [sign the Xap File] checkbox, build project failed due to signtool.exe not found. Fol ...
- 亚马逊开放机器学习系统源代码:挑战谷歌TensorFlow
北京时间5月17日上午消息,亚马逊在开源技术领域迈出了更大的步伐,宣布开放该公司的机器学习软件DSSTNE的源代码.这个最新项目将与谷歌的TensorFlow竞争,后者已于去年开源.亚马逊表示,在缺乏 ...