javascript - 是否可以将匿名函数标记为 "Live Code"以便 Closure Compiler 不删除它?

标签 javascript anonymous-function google-closure-compiler

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

假设我有一个 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);

给函数起一个名字会让 Closure Compiler 高兴。

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

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 + '})');

关于javascript - 是否可以将匿名函数标记为 "Live Code"以便 Closure Compiler 不删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8219813/

相关文章:

javascript - 在 Google Closure Compiler 中保留已经缩小的代码片段

javascript - 如何更改mvc中验证消息的样式?

javascript - Ajax 使用 Django Rest Framework 收到 403 禁止错误

matlab - MATLAB中的逐次函数应用

javascript - 匿名函数参数

javascript - 缩小 NodeJS 中使用的代码是否有意义?

javascript - Google Closure Compiler 中的动态类型发现

javascript - 即使 beforeSelectRow 返回 false,jqgrid 复选框也可选择

javascript - 在网页之间传递大量数据

javascript - 从 jQuery $.each 循环返回