今天研读大神们的JS代码时,看到一个很诡异的写法:
var abc = new function () {
var self = this;
this.xx = function (x) {
//x
//more...
}
}();
这和普通的闭包方法有何不同呢?百度了一下资料也比较少,我们只知道
var fun1 = new Function ('a', 'return a');
console.log( fun1(1) ); //1
这种通过Function原型的方式可以将字符串转化为可使用的方法, 前面传入的字符串为参数,最后的字符串为方法体内执行的代码。
但是new function () {} 这种写法又为何物?注意前面的f是小写,而且后面和函数一样的{}括号。
让我们试一下:
var fun2 = new function (num) {
var a = num;
this.a = a;
this.b = function () {
this.a = ++a;
}
}(1);
console.log(fun2.a); //1
fun2.b();
console.log(fun2.a); //2
fun2.b();
console.log(fun2.a); //3
然后我发现,其实这种写法等价于:
var fun3 = function (num) {
var a = 1;
this.a = a;
this.b = function () {
this.a = ++a;
}
}
var newfun3 = new fun3(1);
console.log(newfun3.a); //1
newfun3.b();
console.log(newfun3.a); //2
newfun3.b();
console.log(newfun3.a); //3
只不过是匿名且立刻执行的,仅此而已,与正常闭包方法的不同点仅在于
var fun4 = (function (num) {
var a = num;
var c = function () {
return a;
}
var that = {
b: function () {
a++;
},
get_a: c
}
return that;
})(1);
fun4.b();
console.log(fun4.get_a()); //2
fun4.b();
console.log(fun4.get_a()); //3
匿名new使用this.xx来暴露公共方法,而匿名function通过return {xx:xx}来暴露,仅此而已。
JS果真是千奇百怪的写法。