是否可以将匿名函数标记为“实时代码”?这样闭包编译器就不会删除它
Is it possible to mark an anonymous function as "Live Code" so that Closure Compiler does not remove it?
我如何告诉闭包编译器匿名函数不应该作为死代码被删除?我不想将函数存储到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文件上运行编译器时,编译器通过不输出任何内容来"优化"我的代码。这显然不是我想要的。是否有某种JSDoc我可以把我的函数标记为不是死代码?
~~~~~~~~~~~~~~~~~~~~~~~~
变通:(这不是我真正想要的,但它似乎是最好的结果与可用的工具)
~~~~~~~~~~~~~~~~~~~~~~~~
我最后使用了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);
给函数一个名字会让闭包编译器高兴。
根据函数的不同,闭包编译器将在函数外部定义变量,因此我将代码包装在括号中以避免定义全局变量。
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() {...})();
和post处理代码以去掉不需要的部分。即使这在高级模式下也可能不可行,因为它可能会尝试内联函数。
相关文章:
- 使用Google闭包编译器包含一个Ecmascript 6类
- 使用Google闭包编译器调试代码删除
- google闭包编译器、PRETTY_PRINT和object literal
- 闭包编译器--调试解决了我的错误
- 闭包编译器、主干和元编程
- 无法使用 ant 和闭包编译器编译 javascript,因为 Jquery 的 $ 是未声明的
- 为什么 Google 闭包编译器会重命名对象的属性名称
- 谷歌闭包编译器不压缩字符串值
- Google 闭包编译器和音频事件
- 如何在JavaScript中为Google闭包编译器设置参数类型
- 闭包编译器不支持ES6
- 闭包编译器高级和服务器端注入的Javascript
- 闭包编译器将't关闭可疑代码警告
- 谷歌闭包编译器,某些属性永远不会被重命名
- 用谷歌闭包编译器编译jQuery会产生Uncaught TypeError
- 什么是闭包编译器
- 闭包编译器无法读取目录
- 使用闭包编译器简单优化从函数内部删除调试代码
- 闭包编译器命令行没有'似乎不适用于最新版本
- 闭包编译器可以构建CommonJS模块