javascript闭包详解

看看在线闭包的概念和文章,针对这个问题,把它梳理一下。

问:关闭是什么

答:闭包意味着在Javascript中,内部函数总是可以访问它们外部函数中声明的参数和变量,甚至在返回外部函数之后(生命结束)。



这是我第一次遇到闭包。






闭合循环问题

P {背景:# CCC;宽度:300px;身高:100px;}



0款
1款
2款
3款
4款

对于(var i = 0;i < 5;i + +){
document.getelementbyid(P+我)。Onclick =函数(){
警报(i);访问我闭包的父函数变量
};
};






如果您以前没有使用过,估计单击一段将弹出相应的编号0, 1, 2、3和4的段落,但事实上,全部都是5。

互联网上有很多博客已经在网上讨论过,他们已经给出了很多方法来实现相应数量的弹出。

解决方案1:在对应段落的某个属性上保留变量i




无功部分= document.getelementsbytagname(P);
对于(var i = 0;i < 5;i + +){
人{我}不=我;
我祈祷{ }。onclick =函数(){
警戒(此,否);
}
};



解决方案2:添加一层闭包,以函数参数的形式传递给内部函数。




无功部分= document.getelementsbytagname(P);
对于(var i = 0;i < 5;i + +){
人{我}不=我;
我祈祷{ }。onclick =函数(){
警戒(此,否);
}
};



对于闭包问题,联机参数是变量i通过指针或变量地址保存在函数中。好的,它与指针有关,然后再进行探索。

探索1,返回全部10,而不是




函数测试(){
var = 10;
对于(var i = 0;i < 5;i + +){
document.getelementbyid(P+我)。Onclick =函数(){
警报(临时);访问临时关闭的父函数变量
}
};
温度=20;
});



探索2,返回10,然后返回到20。




函数测试(){
var = 10;
对于(var i = 0;i < 5;i + +){
document.getelementbyid(P+我)。Onclick =函数(){
警报(临时);访问我闭包的父函数变量
}
如果(i = = 1){
警报(临时);
}
};
温度=20;
});



从1和2个探索中,我们可以得出结论,函数可以访问与函数相同级别的变量,并且变量驻留在内存中。

然后,在JS闭包中查看这个对象上的一篇文章,然后继续讨论这个问题。




关闭这1个js / JS
窗口;
var对象{ { {
名称:我的目标,
getnamefunc1:函数(){
返回 / / this.name;
console.log(本); / /对象
返回(函数)关闭,访问是一个全局变量,这个窗口
console.log(本); / /窗口
返回this.name; / /窗口
}
},
getnamefunc2:函数(){
返回this.name; / /访问对象
},
函数(){
警报(22);
}
};
警报(对象。getnamefunc1)(()); / /窗口弹出



问:为什么匿名函数不能得到包含它作用域的这个对象

答:当调用函数时,每个函数都会自动得到两个特殊的变量:这个和参数。当内部函数搜索这两个变量时,它们命令搜索它们的活动对象,因此在外部函数中不可能直接访问这两个变量。

但您可以通过以下代码实现(直接访问外部函数中的变量):




关闭这2个js / JS
窗口;
var对象{ { {
名称:我的目标,
GetNameFunc:函数(){
var =;
console.log(本); / /输出对象
返回函数(){
console.log(本); / /输出仍然是Windows
返回that.name;
};
}
};
警报(对象。getnamefunc)(()); / /我的对象弹出



不同的是,这个对象被分配给那个变量,甚至在函数返回之后,仍然引用对象,所以它返回对象。

我已经写了这么多闭包,我会告诉你闭包是上帝使用的。否则,事情总是一团糟。

看看这样一个典型的闭包案例:


函数A(){
var a=1;
函数B(){
返回一个;
};
返回B;
};

var c =一(); / / C已经进入了一个子范围B的访问接口
Console.log(C()); / / 1 C可以访问变量A在B的父域




只要其他范围可以采取子范围的访问接口,那么其他领域的方法来访问孩子的父母的域变量。这样,如果将来您需要访问一个功能会很有用的。

事实上,在互联网上也发现了很多这样的代码。我只是想总结一下我的理解过程。