引: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函数使用原函数局部变量的更多相关文章

  1. 第十二篇 Python函数之全局变量&局部变量&递归函数

    全局变量:在定义的时候,顶头写的,没有任何缩进的变量就是全局变量. 全局变量的特点:在当前文件里的任何地方都可以进行调用 局部变量:在子程序里定义的变量,就是局部变量. 子程序:比如.py文件里,写的 ...

  2. Python新手学习基础之函数-全局变量和局部变量

    全局变量和局部变量 我们通常把定义在函数外的变量成为全局变量,定义在函数内的变量称为局部变量,顾名思义,全局变量的作用域是整个代码段,局部变量的作用域就只是在它所属的代码段,变量只在它的作用域里有效. ...

  3. JS模式--装饰者模式(用AOP动态改变函数的参数)

    Function.prototype.before = function (beforefn) { var _self = this; return function () { beforefn.ap ...

  4. Python自动化--语言基础3--字典、函数、全局/局部变量

    字典 dict1 = {'name':'han','age':18,'class':'first'} print(dict1.keys()) #打印所有的key值 print(dict1.values ...

  5. c c++ 函数不要返回局部变量的指针

    结论:普通的变量(非new的变量)都是系统自动分配的,在栈空间(连续分配),无需程序员操作,速度快,但是...空间有限,不适合大量数据,大量的话就需要自己new new出来的变量是处于大容量的堆空间, ...

  6. 【逆向工具】IDA使用2-VS2015版本release查找main函数入口,局部变量

    VS2015版本release查找main函数入口 vc++开发的程序main或WinMain函数是语法规定的用户入口,而不是应用程序入口.入口代码是mainCRTstartup.wmainCRTSt ...

  7. Python3基础 global 使函数中的局部变量升格为全局变量

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. C指针函数中的局部变量返回

    所谓指针函数其实就是  :一个函数的返回值为指针. 指针函数定义:返回类型标识符*  函数名(形参列表){函数体} eg:   int*  fun1(int n){} 指针函数和局部变量返回解析: 简 ...

  9. Python3基础(3)集合、文件操作、字符转编码、函数、全局/局部变量、递归、函数式编程、高阶函数

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

随机推荐

  1. strong reference cycle in block

    However, because the reference is weak, the object that self points to could be deallocated while th ...

  2. javascript--关于错误

    错误是一定会发生,所以语言都会有自己的错误处理机制.javascript的错误处理机制,关乎throw.try.catch. try 语句允许我们定义在执行时进行错误测试的代码块. catch 语句允 ...

  3. BVT & BAT & SVT

    1. BVT(Build Verification Test) a. BVT概念 Build Verification test is a set of tests run on every new ...

  4. qt编程入门

    面对qt编程,必须先知道qt中常用的类: QPushButton按钮类.QLabel标签类.QMessageBox对话框类.QCheckBox.QAction.QMenu.QStatusBar.QTo ...

  5. 使用GDB进行调试

    下面是几篇非常好的GDB使用指南: http://www.cs.cmu.edu/~gilpin/tutorial/ http://oss.org.cn/ossdocs/gnu/linux/gdb.ht ...

  6. how to monitor system logs and export to files simultaneously

    What will you do when you conduct a malware analysis on a smartphone? You will focus on running proc ...

  7. 计算机网络 学习笔记-传输层:TCP协议简介

    概述: TCP传输前先要建立连接 TCP在传输层 点对点,一条TCP只能连接两个端点 可靠传输.无差错.不丢失.不重复.按顺序 全双工 字节流 TCP报文段 TCP报文段的报头前20字节是固定的,后面 ...

  8. 【过程改进】10分钟进阶Nuget

    目录 nuget初识 nuget本地包 nuget解决依赖冲突 nuget是什么 .net版的maven(java)? 如果你用过windows的chocolatey,mac的homebrew或许更容 ...

  9. 天气api

    http://php.weather.sina.com.cn/xml.php?city=%D6%D8%C7%EC&password=DJOYnieT8234jlsK&day=0 cit ...

  10. 【IIS】 网站优化

    [IIS] 网站优化 一. 从硬件入手,升级服务器的cpu,内存,硬盘 这是成本最低的方法,所以如果要优化,请先考虑下现有服务器的硬件能力是不是满足要求. 二. 从数据库入手 索引: 检查该建的索引建 ...