是否有能力在JavaScript中获取闭包变量列表(好的,也许是所有范围变量)?
样品:
function factory(){
var _secret = "Some secret";
return function(code){
// How to get parent function variables names here?
// ...
}
}
var inside = factory();
inside();
答案 0 :(得分:3)
假设这是出于调试目的,您可以尝试解析函数体并评估找到的标识符:
function getvars(fn, _eval) {
var words = String(fn).replace(/".*?"|'.*?'/g, '').match(/\b[_A-Za-z]\w*/g),
ret = {}
words.forEach(function(w) {
try { ret[w] = _eval(w) } catch (e) {};
});
return ret;
}
function factory() {
var _secret = "Some secret";
var _other = "Other secret";
return function(code){
var vars = getvars(factory, _ => eval(_));
return vars;
}
}
vars = factory()();
document.write('<pre>'+JSON.stringify(vars,0,3));
&#13;
毋庸置疑,这是处理代码的一种非常天真的方式,因此请小心处理。
答案 1 :(得分:1)
没有全面的方法来获取范围内所有变量的列表。您可以枚举this
对象,但这仍然只会在this
上为您提供可枚举对象的列表,即使这样,仍会有类似函数的内容不在this
上的参数。
所以不,这不可能。另请查看此similar question。
答案 2 :(得分:1)
不,这是不可能的。 ECMAScript规范不会向任何地方的最终用户公开Enviroment Record个对象。
答案 3 :(得分:1)
查看它们的一种方法是使用 console.dir
获取所有作用域,包括闭包作用域及其变量列表。示例:
function factory(){
var _secret = "Some secret";
var i = 0;
return function(){
i++;
return _secret + i;
}
}
var inside = factory();
inside(); // "Some secret1"
inside(); // "Some secret2"
console.dir(inside); // It shows you all variables in [[Scopes]] > Closure
您将如何看到控制台的图像:
它适用于基于 Chromium 的浏览器。
中嵌套范围的相关答案答案 4 :(得分:0)
由于闭包的主要概念是作用域,而闭包中的变量是私有的,因此无法以某种方式暴露它们,例如通过方法,就无法实现这一点。
你真正想要实现的是什么?