Javascript 是否可以将匿名函数标记为";“实时代码”;这样闭包编译器就不会删除它了?

Javascript 是否可以将匿名函数标记为";“实时代码”;这样闭包编译器就不会删除它了?,javascript,anonymous-function,google-closure-compiler,Javascript,Anonymous Function,Google Closure Compiler,如何告诉闭包编译器匿名函数不应作为死代码删除?我不想将函数存储到窗口对象。我正在寻找另一种技术 假设我有一个javascript文件,其中包含一个巨大的匿名函数 (function(){return "I am here!"}) 为了便于使用,我通过ajax下载了这个函数,然后使用 var f = eval('(function(){return "I am here!"})'); 这将在变量f中指定匿名函数 d8> var f = eval('(function(){return "

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

假设我有一个javascript文件,其中包含一个巨大的匿名函数

(function(){return "I am here!"})
为了便于使用,我通过ajax下载了这个函数,然后使用

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文件上运行编译器时,编译器通过不输出任何内容来“优化”我的代码。这显然不是我想要的。是否有某种类型的JSDoc可以放在我的函数之上,以标记它不是死代码

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

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

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

最后我结合了约翰和大卫的答案:

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

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

f = eval(code);
给函数命名会使闭包编译器感到高兴

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


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

您可以将函数存储在文件中而不使用包装器,这将阻止编译器对其进行“优化”,然后在评估时添加函数包装器

var code = 'return "I am here!";';
var f = eval('(function(){' + code + '})');
如果您的代码在没有函数包装的情况下确实是“无效”的,那么您可以让它保持包装状态,但执行包装,然后继续上面的操作。例如:

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

编译器不是为处理代码段而构建的。我看到的唯一解决方案是使代码有效

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

然后对代码进行后期处理,去掉你不想要的部分。即使这在高级模式下也可能不可行,因为它可能尝试内联函数。

没有函数包装器,函数块中的代码无效,因此无法编译。编译器被JSC_PARSE_error阻塞,它怎么会无效?你能把密码寄出去吗?否则,请尝试立即执行函数包装器,并按照我的建议再次包装它,即使简单的“我在这里”代码无效,除非包装在函数中,因为返回语句:SyntaxError:非法返回语句a很好,在这种情况下,您可以使用我发布的第二个示例,我把你的代码标记为答案。我调整了它,把它放在原来的问题中,这样我就可以格式化它了。我也尝试过这个。简单模式工作正常,但高级模式不喜欢。它还移动一个var e=null;如果你试图使用高级模式,你可以使用编译器的“输出包装器”和外部程序来完成你想要的。使用此包装器:(function(){var result;%output%;return result})您希望确保“result”与代码中的名称不冲突,并在外部定义中声明它。