【问题标题】:How can I check for undefined identifiers using UglifyJS如何使用 UglifyJS 检查未定义的标识符
【发布时间】:2012-09-19 13:01:39
【问题描述】:

我想使用 UglifyJS 解析器来检查一段代码中是否有任何标识符在不能保证被定义的情况下被使用。

例子:

// Should raise an error since myfunc and myvar have not been defined, but works
var ast = jsp.parse('myfunc(myvar);');

我意识到 myfuncmyvar 不是必然未定义(因为它们可能存在于范围内)但我想知道它们何时可能可能未定义.

echo "myfunc(myvar);" | uglifyjs 愉快地返回 myfunc(myvar);,但我找不到任何选项来检查未定义的变量。

如果我运行 JSLint 并关闭 assume browser, window, node.js, etc all off,那么这就是我想要的结果。我想对 UglifyJS 做类似的事情,假设对环境一无所知(没有窗口、控制台、警报等)。

【问题讨论】:

    标签: javascript parsing uglifyjs


    【解决方案1】:

    您的要求很高,因为您希望确定字符串文字的某些内容是否构成有效代码。字符串文字几乎可以是字面上的(呵呵)任何东西。当然可以(这是一个与“简单”完全不同的概念)指定根据某些规范预期字符串文字有效的确切情况,但如果您需要帮助,您需要表明你已经有了一个可以识别这些文字的算法。

    首先,您需要确定此类情况,其次,说明此类文字内容必须遵循的一组规则(形式语法将是一个很好的方法)(请注意,在某些情况下,但不是全部, 情况下,有可能用正则表达式来表达这样的语法)。

    【讨论】:

    • UglifyJS 已经能够确定一个字符串是否是有效的代码(它是一个解析器,所以这就是它的用途)。我的问题具体是如何扩展其解析功能以标记未定义的标识符。
    【解决方案2】:

    您可以使用“范围链”。变量范围在这篇文章http://tore.darell.no/pages/scope_in_javascript 中进行了描述。

    使用范围链可能很容易,也可能不...

    这是来自文章的一个很好的例子

    //global
    function foo () {
      //global.foo
      function bar () {
        //global.foo.bar
        function baz () {
          //global.foo.bar.baz
        }
      }
    }
    

    您可以检查您的函数和/或变量是否在此范围链中定义,或者在您的范围链中定义到特定级别。 (例如 global.foo.bar 中的所有内容都可以)。

    也许这就是您解决问题的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多