获取Javascript中的闭包变量列表

时间:2016-02-05 11:54:03

标签: javascript

是否有能力在JavaScript中获取闭包变量列表(好的,也许是所有范围变量)?

样品:

function factory(){
    var _secret = "Some secret";
    return function(code){
        // How to get parent function variables names here? 
        // ...
    }
}

var inside = factory();

inside();

5 个答案:

答案 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;
&#13;
&#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

您将如何看到控制台的图像:

console.dir output

它适用于基于 Chromium 的浏览器。

编辑: 相关问题 https://stackoverflow.com/a/66896639/2391782

中嵌套范围的相关答案

答案 4 :(得分:0)

由于闭包的主要概念是作用域,而闭包中的变量是私有的,因此无法以某种方式暴露它们,例如通过方法,就无法实现这一点。

你真正想要实现的是什么?