我正在编写一些 JavaScript 分析位,并且需要能够拦截闭包内的方法。
我设法让这个工作:
var t = (function() {
var echo = function(v) { console.log("calling echo with " + v); };
return {
intercept: function(n, f) {
var old = eval(n);
var newFunction = (function(that, old){
return f(that, old);
})(this, old);
eval(n + " = newFunction ");
},
getEchoFunction: function() { return echo; }
};
})();
var c = t.getEchoFunction();
c("hello");
t.intercept("echo", function(that,old){
return function() {
console.log("before echo");
old.apply(that,arguments);
console.log("after echo");
};
});
c = t.getEchoFunction();
c("world");
输出是:
“用你好呼唤回声” “回声前” “与世界呼应” “回声后”
所以,这个“拦截”API 让我可以拦截并重写隐藏在闭包中的函数声明。
然而,世界上有很多关于 eval 的抱怨。
有什么方法可以编写相同的 API 而无需eval
在intercept
函数中使用?