Getting All Variables In Scope

前端 未结 10 2271
小蘑菇
小蘑菇 2020-11-22 09:10

Is there a way to get all variables that are currently in scope in javascript?

10条回答
  •  一整个雨季
    2020-11-22 10:02

    Although everyone answer "No" and I know that "No" is the right answer but if you really need to get local variables of a function there is a restricted way.

    Consider this function:

    var f = function() {
        var x = 0;
        console.log(x);
    };
    

    You can convert your function to a string:

    var s = f + '';
    

    You will get source of function as a string

    'function () {\nvar x = 0;\nconsole.log(x);\n}'
    

    Now you can use a parser like esprima to parse function code and find local variable declarations.

    var s = 'function () {\nvar x = 0;\nconsole.log(x);\n}';
    s = s.slice(12); // to remove "function () "
    var esprima = require('esprima');
    var result = esprima.parse(s);
    

    and find objects with:

    obj.type == "VariableDeclaration"
    

    in the result (I have removed console.log(x) below):

    {
        "type": "Program",
        "body": [
            {
                "type": "VariableDeclaration",
                "declarations": [
                    {
                        "type": "VariableDeclarator",
                        "id": {
                            "type": "Identifier",
                            "name": "x"
                        },
                        "init": {
                            "type": "Literal",
                            "value": 0,
                            "raw": "0"
                        }
                    }
                ],
                "kind": "var"
            }
        ]
    }
    

    I have tested this in Chrome, Firefox and Node.

    But the problem with this method is that you just have the variables defined in the function itself. For example for this one:

    var g = function() {
        var y = 0;
        var f = function() {
            var x = 0;
            console.log(x);
        };
    }
    

    you just have access to the x and not y. But still you can use chains of caller (arguments.callee.caller.caller.caller) in a loop to find local variables of caller functions. If you have all local variable names so you have scope variables. With the variable names you have access to values with a simple eval.

提交回复
热议问题