Javascript 你能在闭包中截取局部变量而不进行求值吗?
我正在编写一些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)
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不愿意添加更干净的方法来进一步公开绑定