Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止闭包编译器重命名;“真的”&引用;假;及;空";_Javascript_Google Closure Compiler - Fatal编程技术网

Javascript 如何防止闭包编译器重命名;“真的”&引用;假;及;空";

Javascript 如何防止闭包编译器重命名;“真的”&引用;假;及;空";,javascript,google-closure-compiler,Javascript,Google Closure Compiler,谷歌闭包编译器重命名代码中出现的所有“真”、“假”和“空” var s = true, x = null, V = false; 用这些速记代替;在以下情况下: if (someVariable == s) 现在;谷歌分析代码定义了它自己的“s”变量;重写值“true”;正如你所看到的,这会导致很多问题 我不想更改GA代码;我只是想让闭包编译器停止重命名true等。外部程序不工作 您知道实现这一点的方法吗?您这里的主要问题是您的代码在全局范围/命名空间中运行,这就是崩溃的原因 要修复它,请将

谷歌闭包编译器重命名代码中出现的所有“真”、“假”和“空”

var s = true, x = null, V = false;
用这些速记代替;在以下情况下:

if (someVariable == s)
现在;谷歌分析代码定义了它自己的“s”变量;重写值“true”;正如你所看到的,这会导致很多问题

我不想更改GA代码;我只是想让闭包编译器停止重命名true等。外部程序不工作


您知道实现这一点的方法吗?

您这里的主要问题是您的代码在全局范围/命名空间中运行,这就是崩溃的原因

要修复它,请将其放入一个匿名函数包装器中

(function() {
    // a self contained "namespace"
    var s = true; // won't be affected by the analytics code anymore       


    // expose something
    window.foo = function() {};

})(); // execute the function immediately
这是防止变量名冲突等的常用习惯用法。如果需要在包装器之外提供内容,只需将它们作为属性添加到
窗口
对象中即可


不要费心处理闭包,当您更改代码时,可能会给变量起不同的名字。当页面上突然出现更多的全局变量时,又会发生什么呢?所有这些问题都是将代码放在上述包装器中的好理由。

事实证明,可以通过名为“output\u wrapper”的参数将全局定义(函数和/或变量)打印到命令行代码中,如

java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --output_wrapper "(function(){%output%})();" --js input.js --js_output_file output.js

这样,它就不会与全局变量冲突,并将所有代码打印在匿名函数包装器中。

编译器选项中有一个选项称为。当设置为
false
时,编译器将不会别名为'true'、'false'和'null'。

您可以提供自己的常量,例如
\u true\u=true
,然后在运行闭包编译器之前替换为这些常量吗?实际上,我不重命名任何东西。我有几个文件在一次运行中通过CC(闭包编译器)运行;每个单独文件中的所有代码都有自己的名称空间和匿名函数包装器,如您的示例所示。只是,CC“奇怪地”重命名了全局命名空间中的“真”、“假”和“空”。我不能改变CC的行为方式。我建议使用这种方法,而不要在预混淆的代码中添加匿名函数。这是因为闭包编译器将true、false和null值放在全局命名空间中,这可能会导致与其他JSF冲突。这正是我所寻找的。对于未来的访问者来说,幸运的是,这个适得其反的特性在2015年被删除(压缩重复符号就是GZIP的目的)。