gpt4 book ai didi

javascript - 在 JavaScript 中收缩变量

转载 作者:行者123 更新时间:2023-12-03 18:26:53 25 4
gpt4 key购买 nike

我正在构建一个 JavaScript 压缩器,我正处于“缩小局部变量”阶段。我一直在比较我的压缩器与各种在线压缩器的结果,并注意到 Dean Edwards' /packer/ 有一些有趣的东西。 .

让我们以 jQuery 库的这个片段为例:

(function( window, undefined ) {
var document = window.document,
navigator = window.navigator,
location = window.location;
});

我的压缩器返回以下代码:

(function(a,b){var c=a.document,d=a.navigator,e=a.location});

但是/packer/返回这个:

(function(a,b){var c=a.document,navigator=a.navigator,location=a.location});

/packer/在 var 列表中的第一个变量之后不收缩变量有什么原因吗?这仅仅是一个错误还是有原因?

乍一看似乎我的压缩器在做正确的事情并且会给出更好的最终结果,但是让我们看一下 jQuery 库中的另一个示例:

var jQuery = (function() {

var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context, rootjQuery );
},
// some other vars
rootjQuery;
// etc...
});

这个片段很重要,因为变量 rootjQuery 在定义之前被引用了。

在这种情况下/packer/做同样的事情,只压缩列表中的第一个 var:

var jQuery=(function(){var c=function(a,b){return new c.fn.init(a,b,rootjQuery)},rootjQuery});

然而,我的压缩器将代码弄乱了一点,因为虽然在返回语句中提到它时它不会压缩 rootjQuery(因为它还没有被定义),但它确实会压缩它稍后定义。

var jQuery=(function(){var a=function(b,c){return new a.fn.init(b,c,rootjQuery)},b});

这显然会在尝试执行代码时导致错误。

有什么办法解决这个问题吗? Dean Edwards 似乎注意到了这个问题,因此通过仅压缩列表中的第一个 var 来绕过它,这样在出现这种情况的奇怪情况下,它就不会导致错误。

我曾尝试挑出在定义之前使用的变量,而不是压缩它们,但这并不是那么简单,因为在这种情况下,rootjQuery 的使用范围与定义范围不同。在我到达它之前,我无法知道它将在哪个范围内定义。

最佳答案

我现在已经修好了我的压缩机。

正如 Paul Grime 在评论中所说,在压缩任何内容之前,有必要建立一个包含所有变量及其范围的完整列表。

JavaScript 允许在定义之前引用事物,因此没有办法解决这个问题。

关于javascript - 在 JavaScript 中收缩变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9589306/

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