2

我正在编写一些 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 而无需evalintercept函数中使用?

4

1 回答 1

3

不,不幸的是,没有办法访问类似于window[...]工作方式的非全局范围。

但是,根据您需要做什么,使用对象而不是本机范围将是一个好主意。

于 2012-11-18T23:23:39.060 回答