javascript - 如何指示闭包编译器不重命名/删除局部变量?

标签 javascript web-deployment google-closure-compiler

在下面的代码中,我需要变量 some_var 不被 Google 的 Closure 编译器重命名或删除。

function scopedEval(code){
    var some_var = 'world' ;
    return eval('('+code+')') ;
}
scopedEval('alert("hello, "+some_var)') ;

要评估的代码依赖于一些变量的存在,因此我需要保持它们不变。

我如何指示闭包编译器执行此操作?

PS:
请忽略使用 eval 是一种不好的做法的问题。这完全是另一回事。

最佳答案

可能有一些闭包编译器选项专门允许此类事情,但如果做不到这一点,我会通过以下两种方式之一解决问题:

选项 1

创建一个全局对象来存储变量,然后使用js_externs选项来防止它被修改:

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @js_externs vars
// ==/ClosureCompiler==
vars = {};

然后您可以将字符串属性应用于应保持不变的对象

function scopedEval(code){
    vars['some_var'] = 'world';
    return eval('('+code+')');
}
scopedEval('alert("hello, "+vars["some_var"])');

选项 2

如果由于某种原因 vars['some_var'] 不适用于您,并且您需要在 eval 中逐字使用 some_var ed 代码,那么您可以使用 with 来解决这个问题。在这种情况下,您不需要将 vars 声明为 extern。

function scopedEval(code){
    var vars = {
      "some_var": "world"
    };
    with(vars) {
      return eval('('+code+')');
    }
}
scopedEval('alert("hello, "+some_var)');

我将让您自行决定是否使用 JavaScript 中最受批评的两个功能(即 witheval),是否觉得肮脏。

关于javascript - 如何指示闭包编译器不重命名/删除局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30857142/

相关文章:

javascript - 在 ADVANCED_MODE 中使用 Closure Compiler 和 AngularJS

javascript - 如何管理未知数量的文本区域的状态?

javascript - 带有传递变量的partialrefreshPost

Angular 4 ng构建base-href重复子目录

linux - 是否有必要为不同的用户运行多个 uWSGI 网站?

minify - 为什么 Google Closure Compiler 不重命名这些外部变量?

javascript - 重新格式化 javascript 以适应 google-closure-compiler 的命名空间展平

javascript - 为什么我无法预览输入字段上传的图像并将其显示在 Canvas 中?

javascript - Angular 组件路由器从 URL 中删除 #

tomcat - 将 Web 应用程序从本地计算机部署到远程 tomcat 服务器