JavaScript的 new function () {} 写法

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





猜你喜欢

转载自blog.csdn.net/qazxbjp2010/article/details/58071197