如何从JavaScript代码字符串中提取变量名称和属性名称?

时间:2017-01-31 02:58:57

标签: javascript parsing expression eval abstract-syntax-tree

将JavaScript表达式作为字符串,如何提取表达式中使用的变量名称,并超越它,提取在这些变量上访问的任何属性的名称?

这些表达式由另一位作者使用他们自己的个性化名称撰写,例如cabbageelephant.weight

表达式可能很简单,例如:firstNamename.charAt(0)c.radius * Math.PI

但也可能是复杂的事情:

(function(){
    var fruit = apple || banana.length;
    if (fruit > citrus.lime) {
        fruitSalad += "," + citrus.lemon;
        // ...
        return lemon.split(/[0-9]+/);
    }
    return fruitBowl.width * fruitBowl['amount'] * Math.SQRT2;
})();

运行上述表达式将引发引用错误,除非定义了apple之类的变量。如果我有一种解析表达式并提取未定义变量名的方法,我可以记下它们,并在以后运行表达式而没有任何问题,每个变量都有值。

此外,如果我可以注意哪些变量具有属性以及这些属性的名称,那么我也可以初始化这些属性。

fruit = apple = banana = fruitSalad = "";
citrus = { lemon: "0", lime: "1" };
fruitBowl = { width: "10", amount: "30" };
// run the expression

我试过的东西

  1. 只需运行表达式并使用try / catch 来捕获每个引用错误,解析变量名称的异常文本。这是危险的,因为每个浏览器中的异常文本都不同。这也没有考虑表达式中未立即评估的部分,例如isTrue? yesText : noText。由于访问对象的未定义属性不会产生错误,因此无法注意这些错误。
  2. 使用Esprima等库将表达式解析为AST 。这是我第一次使用AST(抽象语法树)。我想我可以访问代码中使用的标识符,但似乎没有明确区分变量名和属性名。由于输出非常冗长,所以很容易让事情滑落。我已经研究过AST步行者,但没有什么能成为解决方案。
  3. 注意:假设不会使用eval。变量将始终是字符串或属性为字符串的对象,因此知道变量的类型不是问题,只有使用的名称。可以忽略表达式中使用的函数名称。

0 个答案:

没有答案