今天研究了一天闭包.真是众说纷纭.吓得我连闭包的定义都不敢写了.只能说,js如果声明类,可以用这样闭包的写法.
另外这个写法,是从typescript生成的js学来的.想来也算是非常规范的写法了.
先看看怎么使用
var myclass = (function () {
function myclass() {
//实例变量
this.var1 = 1;
this.var2 = "aaa";
//其他初始化代码
;
}
//静态变量
myclass.staticVar = 3;
//函数的例子
myclass.prototype.func1 = function (a, b) { return a + b }
return myclass;
}());
var obj=new myclass();
讲解
var myclass = (function mc() {
//1.这是类本身,在这里定义变量,并执行初始化.
//类特意用mc包起来,是为了看起来清爽一些..否则多个类的代码混在一起.难看
//注意这些this,通常this的作用域是调用者,在这里就是外层的mc.因此this.var1就会存在mc中.外面看不到
//另外,如果不用mc把myclass的代码包起来,this.var1就会存在于window对象上,容易产生内存泄漏
function myclass() {
this.var1 = 1;
this.var2 = "aaa";
}
myclass.staticVar = 3;
//2.给类添加方法,很普通的用prototype
myclass.prototype.func1 = function (a, b) { return a + b }
//3.这里就是闭包了.注意变量var1/2和函数myclass是定义在mc中的.
//那么,当mc执行完毕,var1,var2,myclass函数就应该回收.
//但是,在这里将myclass作为返回结果,并执行(注意mc函数后面的那个不起眼的()),
//那么myclass就会保留下来,而由于闭包的缘故,myclass所引用的var1/2也会保留下来.
//这样,一个类,以及其中的成员就成型了.
return myclass;
}());
var obj=new myclass();
其实定义类可以不用这么麻烦,ES2015已经支持class关键字.但是那也基本是个语法糖而已.而且es2015的普及之路还很遥远.所以这种写法还是值得学习的.