【问题标题】:uglifyjs not obfuscating global variableuglifyjs 不混淆全局变量
【发布时间】:2015-01-18 05:45:40
【问题描述】:

我正在使用 uglifyjs(通过 grunt)并试图混淆一个全局变量,但它不起作用。我正在使用 mangle 的 'toplevel' 选项。

想知道是否有人可以回答为什么?

绕过grunt直接使用uglify,我使用的命令行是:

uglifyjs js/a.js -c -m toplevel -o dist/scripts.js

a.js的内容是:

foo = 5;

function bar() {
  var excellent = 10;

  var myvar = excellent*excellent;

  console.log('myvar = ' + myvar);
}

bar();

function useAGlobal() {
  console.log('foo = ' + foo);
}

useAGlobal();

而丑陋的代码是:

function o(){var o=10,n=o*o;console.log("myvar = "+n)}function n(){console.log("foo = "+foo)}foo=5,o(),n();

我可以看到全局函数bar()useAGlobal() 被混淆得很好,但是为什么变量foo 保持不变?

如果我用 'var' 关键字声明 foovar foo = 5;,那么它确实会被混淆。我在这里错过了什么?

谢谢!

【问题讨论】:

    标签: gruntjs uglifyjs uglifyjs2


    【解决方案1】:

    当您在没有 var 的情况下执行 foo = 5 时,与 var foo = 5 相比,它被认为是一个赋值,这是一个声明。赋值变量名称没有被混淆的原因是它假设它是在全局范围内当前 js 之外的其他地方声明的。在浏览器中,全局范围内的所有内容都与window 相关联。因此,例如,如果您做了location = 'http://www.google.com.au';,它会将您的浏览器发送到谷歌。如果location 被混淆,那么代码将无法正常运行。

    【讨论】:

    • 啊,完美,谢谢。不幸的是,我们可能有一些遗留代码没有使用“var”,所以我猜这些变量不会被混淆......但这就是生活。 :-)
    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2016-12-27
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多