今天课上学习了闭包,一开始不太理解,有幸看到来自阮一峰的一篇文章,写的十分详尽,附上链接:
闭包
以及一篇关于闭包的文章
js循环绑定事件
以下是我的一些笔记
闭包就是能够读取其他函数内部变量的函数
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成”定义在一个函数内部的函数”。
例:
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
上述例子中,f2()就是f1()的闭包函数。类似于c++中的类,n是函数内部的private数据, 而闭包函数就是外部访问这些数据的public方法
函数内定义的函数,默认属于全局作用域(this丢失问题)
闭包的作用
它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
链接中的最后两个例子
- 代码片段1
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){ //f1
return function(){ //f2
return this.name;
};
}
};
alert(object.getNameFunc()());
结果:The Window
原因:对于f1来说,它的this即为object;但是对于f2来说,它的this是全局;这个称为this丢失
- 代码片段2
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){ //f1
var that = this;
return function(){ //f2
return that.name;
};
}
};
alert(object.getNameFunc()());
结果:My Object
原因:f1中,that变量保留了object, 因此在f2中,引用that.name即为object.name
不同闭包
例子1:
解释:c1和c2是counter的不同的闭包函数,因此对应的amount也不同
所以最后一行输出0例子2:
解释:上面这种形式,则视为同一个闭包函数