Javascript 你能在闭包中截取局部变量而不进行求值吗?

Javascript 你能在闭包中截取局部变量而不进行求值吗?,javascript,Javascript,我正在编写一些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)

我正在编写一些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");
输出为:

"calling echo with hello" "before echo" "calling echo with world" "after echo" “向echo打招呼” “回音前” “与世界呼唤回声” “回音后” 所以,这个“截取”API允许我截取和重写隐藏在闭包中的函数声明

然而,世界上有很多关于eval的抱怨


是否有任何方法可以编写相同的API,而无需在
intercept
函数中使用
eval

否,不幸的是,无法访问与
window[…]类似的非全局作用域


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

如果您使用
this[n]=newFunction
,会发生什么?但是如果没有其他方法,这似乎是合法使用
eval
this
指向全局对象,未定义/null(严格模式)或者指向一个对象,但绝不指向另一个作用域。在javascript中,如果有一个预定义的局部作用域符号,这样就可以访问该对象的所有局部变量,那么在这种情况下,它肯定会很方便。的确如此,但不幸的是,它似乎不是很常见。即使在Python中,他们直到最近才添加访问此类作用域的方法(
在py3k中为nonlocal
),我很确定Perl也有这种方法,Ruby不愿意添加更干净的方法来进一步公开绑定