假设我们对具有类似下面对象功能的对象进行了轮询,并且我想使用_.invoke
之类的内容调用每个fn
。我们可以在通过_.invoke(pool, "fn"
)进行gcc高级最小化之前轻松完成此操作,没问题。但是,在minifcation fn
可能是c
或其他一些属性名称之后......无论如何提示 gcc是否有字符串引用属性名称?我希望它在完成代码缩小后更新我对_.invoke(pool, "c")
的调用调用。
有关问题的可重现示例,请尝试在此脚本上使用高级编译运行gcc:
// ==ClosureCompiler==
// @externs_url http://cdn.jsdelivr.net/g/underscorejs
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==
var pool = [{fn: function() {}, prop2: 1}, {fn: function() {}, prop2: 2}, {fn: function() {}, prop2: 3}]
_.invoke(pool, "fn");
哪个产生明显不等同的代码:
_.invoke([{a:function(){},b:1},{a:function(){},b:2},{a:function(){},b:3}],"fn");
我希望得到的编译代码是
_.invoke([{a:function(){},b:1},{a:function(){},b:2},{a:function(){},b:3}],"a");
答案 0 :(得分:2)
只需引用您不希望gcc重命名的媒体名称:
var pool = [{"fn": function() {}, "prop2": 1}, {"fn": fun ...
答案 1 :(得分:2)
有几种方法:
1)引用原始属性定义:
{"fn": ...}
2)在extern文件中提供定义:
/** @type {Object} */
var methods;
methods.fn;
3)使用神奇的“JSCompiler_renameProperty”方法:
_.invoke(pool, JSCompiler_renameProperty("fn"));
这用得不多(因此有更高的机会出现片状),不建议使用基于类型的优化。请注意,您提供了一个存根实现,如:
function JSCompiler_renameProperty(a) { return a; }
如果您希望代码在未编译的情况下运行或在没有警告的情况下编译。