gpt4 book ai didi

javascript - 闭包优化+保留函数名

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:47:23 28 4
gpt4 key购买 nike

我有一个简单的例子:

Javascript:

function testBut(b){
alert("!");
}

HTML:

<button onclick="testBut(this)">Test</button>

现在我通过 Google Closure 编译器运行我的 .js 脚本(从命令行运行),我想保持 testBut 功能完整。

我在很多地方读到我必须使用 --externs 选项并用导出函数的名称定义另一个文件,在这种情况下它只包含:

function testBut(b){}

另外我需要在我的 js 代码中添加有趣的一行:

window['testBut']=testBut;

那么现在问题:

  • 为了保持所需的功能,Closure 中的那个系统真的很愚蠢,需要完成两个容易出错的步骤吗?

  • 是否没有“@...”注解可以满足同样的目的?我试过@export,但它需要 --generate_exports 选项,但它仍然会生成类似丑陋且无用的 goog.a("testBut", testBut);在目标代码中(我尝试了相同的代码,而那些 goog.a(...) 似乎根本没用),这仍然需要导出文件

理想情况下,我正在寻找简单的注释或命令行开关来告诉“不要删除/重命名此函数”,尽可能简单,不添加代码,不添加其他文件。

谢谢

最佳答案

不要混淆 externs 和 exports。

Externs - 在使用不会与您的源代码一起编译的其他代码时提供类型信息和符号名称。

导出 - 使您的符号、属性或函数可用于其他不会编译的代码。

因此在您的简单示例中,您需要:

function testBut(b){
alert("!");
}
window["testBut"] = testBut;

然而,如果 testBut 仅用于外部调用,这可以进一步简化:

window["testBut"] = function(b) {
alert("!");
};

为什么不总是使用第二种表示法?因为内部使用(编译代码中的调用)必须使用完整的引用语法,这会阻止类型检查并减少压缩。

为什么不为导出使用 JSDoc 注释?

这个问题经常出现。

一方面,对于应该如何进行导出并没有全局共识。有多种方法可以完成导出。

此外,通过定义导出符号和函数会阻止死代码消除。以图书馆作者为例。作者希望编译他的库以导出所有公共(public)符号。但是,这样做意味着当其他用户将他的库包含在编译中时,不会发生死代码消除。这否定了 ADVANCED_OPTIMIZATIONS 的主要优势之一。

鼓励库作者在文件底部或单独的文件中提供他们的导出,以便其他用户可以排除它们。

之前有人建议提供一个命令行参数来控制基于命名空间的导出。 IE 类似于 --export mynamespace.*。然而,还没有作者解决这个问题,这不是一个微不足道的变化。

关于javascript - 闭包优化+保留函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20565189/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com