今天研读大神们的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果真是千奇百怪的写法。