闭包的定义:
闭包就是能够读取其他函数内部变量的函数(主要是用于封装变量,收敛权限)
什么时候使用闭包:
一个是前面提到的可以读取函数内部的变量,另一个是让这些变量始终保持在内存中。
先看一般的调用方法:
var flag = "window";
var object = {
flag : "local",
sayFlag: function(){
alert(this.flag);
}
}
object.sayFlag();//local
然后改用闭包:
var flag = "window";
var object = {
flag : "local",
sayFlag: function(){
//返回一个匿名函数
return function(){
alert(this.flag);
}
}
}
object.sayFlag()();//window
补充this:
- 在全局函数中this等于window
- 当函数被当做某个对象的方法调用时,this等于那个对象
- 匿名函数的执行环境具有全局性,this通常指向window
- 构造函数中this指向创建出的对象
- this在事件函数中的指向为触发这个事件的标签
- this在定时器中的指向为window
- this在普通函数中的指向为谁调用并执行就指向谁
那么如何访问“local呢”?
var flag = "window";
var object = {
flag : "local",
sayFlag: function(){
var that = this; //此处的this是object的引用
//返回一个匿名函数
return function(){
alert(that.flag);
}
}
}
object.sayFlag()();//local
闭包变量常驻内存
var say = function(){
var i = 1;
var sayName = function(){
i++;
alert(i);
}
return sayName;
}
var result1 = say();
result1(); //1
result1(); //2
由于闭包访问外部函数的i,外部函数返回引用闭包函数,所以内存不会被回收,i值也常驻内存,所以每次执行say函数时,i并不会重新复制
还有这篇:
https://blog.csdn.net/yingzizizizizizzz/article/details/72887161
有题:
https://blog.csdn.net/yingzizizizizizzz/article/details/77726346