是否可以将匿名函数标记为“实时代码”,以便Closure Compiler不会将其删除?

时间:2011-11-21 23:05:13

标签: javascript anonymous-function google-closure-compiler

如何告诉封闭编译器不应该将匿名函数作为死代码删除?我不想将该函数存储到window对象。我正在寻找另一种技术。

假设我有一个包含一个巨型匿名函数的javascript文件。

(function(){return "I am here!"})

对于用法,我通过ajax下载此函数,然后使用

之类的东西捕获eval的输出
var f = eval('(function(){return "I am here!"})');

这将在变量f中指定匿名函数。

d8> var f = eval('(function(){return "I am here!"})');
d8> f
function (){return "I am here!"}
d8> f()
I am here!

当我在包含单个大型匿名函数的js文件上运行编译器时,编译器通过不输出任何内容来“优化”我的代码。这显然不是我想要的。是否有某种JS​​Doc我可以在我的函数上面标记为不是死代码?

~~~~~~~~~~~~~~~~~~~~~~~~

解决方法:(这不是我想要的,但似乎是使用这些工具的最佳结果)

~~~~~~~~~~~~~~~~~~~~~~~~

我最终结合使用John和David的答案:

// code would be provided from an ajax request
var code = 'function F(){return "I am here!"};'

code = "("+code.replace(/\s*\;\s*$/, "")+");"

f = eval(code);

为函数命名使Closure Compiler感到满意。

根据函数的不同,闭包编译器将在函数外部定义变量,因此我将代码括在括号中以避免定义全局变量。

replace方法只移动用于分隔函数定义的最后一个分号,这样就不会导致语法错误。

2 个答案:

答案 0 :(得分:1)

您可以将函数存储在没有包装器的文件中,这会阻止编译器“优化”它,然后在评估它时添加函数包装器。

var code = 'return "I am here!";';
var f = eval('(function(){' + code + '})');

如果您的代码在没有函数包装器的情况下确实是“无效”,您可以将其保留为包装,但执行包装器,然后继续如上所述。例如:

var code = '(function(){return "I am here!";}())';
var f = eval('(function(){return ' + code + '})');

答案 1 :(得分:1)

编译器不能用于处理代码片段。我看到的唯一解决方案是使代码有效。

var a = (function() {...})();

并对代码进行后期处理以剥离您不想要的部分。即使这可能在ADVANCED模式下也不可行,因为它可能会尝试内联函数。