概念
当内部函数被保存到外部时,将会生成闭包.闭包会导致原有的作用域链不释放造成内存泄漏.
什么是泄露比如手中的撒子,会慢慢的溜出去,剩余的越少,少的就是内存,溜出去的就是占用
闭包的作用
实现公有的变量
eg:函数累加器:
function add(){
var cont=0;
function dd(){
cont++;
document.write(cont);
}
return dd;
}
var demo=add();
demo();
demo();
demo();
demo();
可以做缓存(存储结构)
function test(){
var num=100;
function a(){
num++;
document.write(num);
}
function b(){
num --;
document.write(num);
}
return [a,b];
}
var myArr=test();
myArr[0]();
myArr[1]();
function eater(){
var food="";
var obj={
eat:function (){
document.write("i am eating" + food);
food = "";
},
push: function (myFood){
food =myFood;
}
}
return obj;
}
var eater1=eater();
eater1.push("banana");
eater1.eat();
闭包:运行结果10个10;10个函数访问的是同一个i
function test(){
var arr=[];
for (var i = 0; i < 10; i++) {
arr[i]=function (){
document.write(i+" ");
};
}
return arr;
}
var mArr=test();
for (var i = 0; i < 10; i++) {
mArr[i]();
}
避免闭包加上立即执行函数,一个立即执行函数对应着它里面的函数
十个立即执行函数十个j然后里面的函数执行
function test(){
var arr=[];
for (var i = 0; i < 10; i++) {
//要加上立即执行函数
(function (j){
arr[j]=function (){
document.write(j+" ");
};
}(i));
}
return arr;
}
var mArr=test();
for (var i = 0; i < 10; i++) {
mArr[i]();
}
//比如
(function (j){
arr[i]=function (){
document.write(" "+j);
}
}(0));
(function (j){
arr[i]=function (){
document.write(" "+j);
}
}(1));
}
可以实现封装,属性私有化
var name="小明";
function ko (age){
var name="小白"
this.age=age;
function hh(){
console.log(name)
}
return hh();
};
var zm=new ko(19);
模块化开发,防止污染全局变量
var name="小明";
var ko=function (){
var name="小白"
function hh(){
console.log(name)
}
return hh();
}();
网友评论