JavaScript压缩工具是否应该自动合并变量声明?
问题的出现原因是:在一个单独的var语句中初始化变量时,有一个bug。这个问题是关于将一个非常大的字面量赋值给一个变量,而这个赋值操作失败了。最后的解决方案是将对象分割成单独的var声明。
解决方法是:不要让压缩器自动合并var声明,以避免代码更容易遇到这种问题。
以下是对话内容的整理:
我知道有一个例子,这种情况下不希望自动合并var声明。参见这个问题:Have I reached the limits of the size of objects JavaScript in my browser can handle?
那个问题是关于一个bug,当一个变量的初始化发生在一个单独的var语句中时。问题是关于将一个非常大的字面量赋值给一个变量,但赋值操作失败了。最后的解决方案是将对象分割成单独的var声明。
因此,如果压缩器总是这样做,那么你的代码更有可能遇到这种问题。
我记得那不是关于单独的var,而是关于单独的字面量。
你记错了。我最初的建议是将声明分割成单独的var语句,然后将数组拼接起来。单个var语句仍然引起了问题,最后的解决方案是将数组声明分割成单独的var语句,然后将数组拼接起来。
JavaScript minifiers是用来压缩JavaScript代码的工具,它们通过移除空格、注释和不必要的字符来减小文件大小。然而,在压缩JavaScript代码时,是否应该自动合并var声明是一个有争议的问题。
如果var声明带有初始化值,那么自动合并是不安全的。在下面的代码中,第一个立即执行函数中的var声明会被提升到函数顶部,导致y在声明之前被使用,值为undefined。而第二个立即执行函数中的var声明则没有这个问题。
(function () { var x = 1; console.log(y); // undefined var y = 2; })(); (function () { var x = 1, y = 2; console.log(y); // 2 })();
然而,如果var声明没有初始化值,自动合并是安全的。在下面的代码中,y在使用之前被声明,所以没有问题。
(function () { var x = 1, y; console.log(y); // undefined y = 2; })();
JavaScript minifiers通过在生成输出之前扫描整个函数来实现自动合并var声明,这是为了压缩变量名。但需要注意的是,如果函数的参数列表被扩展,完全消除var声明可以节省额外的字节,但这会改变函数的length属性,因此不能指望minifiers会这样做。
(function (x, y) { x = 1; console.log(y); // undefined y = 2; })();
是否应该自动合并var声明取决于声明是否带有初始化值。如果有初始化值,自动合并是不安全的;如果没有初始化值,自动合并是安全的。但需要注意的是,如果函数的参数列表被扩展,完全消除var声明可能会改变函数的length属性。