以前针对闭包有过一定的理解,但是现在回想起来有些模糊,于是又翻阅了一些资料博客之类的,加深一下理解正好也算复习了一下。
为什么要谈到闭包呢,因为最近在工作的时候呢,需要定义一些功能模块,为了不污染全局变量,把模块的一些方法属性定义在了一个全局函数里面,但是想要取到全局函数里面的模块属性,需要在全局函数里面定义一个函数用来返回全局函数的属性,这个内部函数就形成了一个闭包。
第一种写法
function module () {
var a = '1111',
var b = function () {
return a
}
return b
}
var a1 = module()
第二种写法 匿名函数的自执行
var data= {
table : [],
tree : {}
};
(function(dm){
for(var i = 0; i < dm.table.rows; i++){
var row = dm.table.rows[i];
for(var j = 0; j < row.cells; i++){
drawCell(i, j);
}
}
})(data);
闭包的功能,一个就是上述应用场景提到的可以读取函数内部的变量,另一个就是让变量的值始终保持在内存中。
下面给出两个栗子
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
PS:
理解完闭包的概念再去使用commonjs amd cmd umd规范 去定义模块会有很大的帮助。