如果我通过闭包编译器或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() { .. }
谢谢, 韦斯利
答案 0 :(得分:5)
init
因同一原因test
未缩短而缩短...因为它是您代码的公共API的一部分。
当你致电var t = new test()
时,你会创建一个如下所示的对象:
{
init: function() { ... },
prototype: test
}
您可以致电t.init()
。如果编译器不尊重可从全局范围获得的那些变量,则必须在缩小它之前将所有 JavaScript代码内联到一个文件中。否则,每次缩小test.js
时,公共函数test
的名称都会改变。所以这段代码:
<script type="text/javascript" src="js/test.min.js"></script>
<script type="text/javascript">
var t = new test();
t.init();
</script>
会中断(因为test
可能会被minifier更改为a
而init会更改为其他字母。)
至于你问题的第二部分,当你this.init = function
时,你在一个不确定的对象上设置一个属性(它可以是任何东西,因为this
是在JavaScript的调用时设置的在函数test
中声明它。当您编写function init(){}
时,您正在编写function declaration,它将被提升到封闭范围的顶部(意味着您可以在定义范围之前调用它,在您定义范围之前)它。)但是,它不会在test
之外提供。