用 Javascript / jQuery 包装函数
如果我有一个任意函数 myFunc
,我的目标是用一个在执行之前和之后运行代码的包装调用替换该函数,例如
// note: psuedo-javascript
var beforeExecute = function() { ... }
var afterExecute = function() { ... }
myFunc = wrap(myFunc, beforeExecute, afterExecute);
,但是,我没有实现所需的wrap
函数。 jQuery 中是否已经存在这样的东西(我已经仔细查看了文档,但看不到任何东西)?或者有人知道这个的良好实现吗,因为我怀疑如果我尝试自己编写它,我会错过很多边缘情况?
(顺便说一句 - 这样做的原因是对函数进行一些自动检测,因为我们在无法使用 Javascript 分析器等的封闭设备上做了很多工作。如果有比这更好的方法,那么我会很感激这些答案也。)
If I have an arbitrary function myFunc
, what I'm aiming to do is replace this function with a wrapped call that runs code before and after it executes, e.g.
// note: psuedo-javascript
var beforeExecute = function() { ... }
var afterExecute = function() { ... }
myFunc = wrap(myFunc, beforeExecute, afterExecute);
However, I don't have an implementation of the required wrap
function. Is there anything that already exists in jQuery like this (I've had a good look through the docs but cannot see anything)? Alternatively does anybody know of a good implementation of this because I suspect that there are a bunch of edge cases that I'll miss if I try to write it myself?
(BTW - the reason for this is to do some automatic instrumentation of functions because we do a lot of work on closed devices where Javascript profilers etc. are not available. If there's a better way than this then I'd appreciate answers along those lines too.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这是一个
wrap
函数,它将使用完全相同的参数和(如果提供的话)调用before
和after
函数,this
的值相同:Here’s a
wrap
function which will call thebefore
andafter
functions with the exact same arguments and, if supplied, the same value forthis
:接受的实现不提供有条件地调用包装(原始)函数的选项。
这是包装和解开方法的更好方法:
The accepted implementation does not provide an option to call wrapped (original) function conditionally.
Here is a better way to wrap and unwrap a method:
这是我要使用的例子
This is the example I would use
你可以这样做:
这将允许你这样做:
这给了我 Firebug 中的输出:
以这种方式包装时的重要部分是将你的参数从新函数传递回原始函数。
You could do something like:
This would allow you to do:
Which gives me an output in Firebug of:
The important part when wrapping this way, is passing your arguments from the new function back to the original function.
也许我错了,但我认为你可以直接创建一个匿名函数并将其分配给 myFunc:
这样你就可以控制每个函数的参数。
Maybe I'm wrong, but I think you can directly create an anonym function and assign it to myFunc:
In this way you can control the arguments of every function.