gpt4 book ai didi

jquery - 闭包编译器/uglifyjs - this.function 名称没有缩短?

转载 作者:行者123 更新时间:2023-12-01 00:11:43 26 4
gpt4 key购买 nike

如果我通过闭包编译器或uglifyjs运行这段代码,this.init不会被缩短..有人能告诉我为什么吗?

function test() {
var v = "abc";
this.init = function() {
alert('var = ' + v + ' and func = ' + f());
f2();
}
function f() {
return 'def';
}
function f2() {
v = "ghi";
alert('blabla');
alert('filler');
}
}

test();

uglifyjs 将其变成:

function test(){function c(){a="ghi",alert("blabla"),alert("filler")}function b(){return"def"}var a="abc";this.init=function(){alert("var = "+a+" and func = "+b()),c()}}test()

美化后即:

function test() {
function c() {
a = "ghi", alert("blabla"), alert("filler")
}
function b() {
return "def"
}
var a = "abc";
this.init = function () {
alert("var = " + a + " and func = " + b()), c()
}
}

test()

那么为什么 this.init() 没有更改为更短的名称呢?

此外,这样做之间到底有什么区别:

 function init() {..}

 this.init = function() { .. }

谢谢,韦斯利

最佳答案

init 未缩短,原因与 test 未缩短的原因相同...因为它是代码的公共(public) API 的一部分。

当您调用 var t = new test() 时,您将创建一个如下所示的对象:

{
init: function() { ... },
prototype: test
}

并且您可以调用t.init()。如果编译器不考虑全局范围内可用的那些变量,则在缩小 JavaScript 代码之前,您必须将所有 JavaScript 代码内联到一个文件中。否则,每次缩小 test.js 时,公共(public)函数 test 的名称都会改变。所以这段代码:

<script type="text/javascript" src="js/test.min.js"></script>
<script type="text/javascript">
var t = new test();
t.init();
</script>

会中断(因为test可能会被压缩器更改为a,并初始化为其他字母。)

关于问题的第二部分,当您执行 this.init = function 时,您正在为不确定的对象设置一个属性(它可以是任何东西,因为 this > 在 JavaScript 调用时设置,并且您在函数 test 中声明它)。当您编写 function init(){} 时,您正在编写 function declaration ,它将被提升到封闭范围的顶部(这意味着您可以在定义它之前在定义它的范围内调用它。)但是,它在 test< 之外不可用.

关于jquery - 闭包编译器/uglifyjs - this.function 名称没有缩短?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968840/

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