之前看到一个观点是 闭包是走向高级Javascript的必经之路,之前看过很多关于闭包的讲解帖子,一直没有理解透彻,模棱两可。
现在终于可以讲出来了。
检验自己有没有掌握一个知识,最好的方式是讲给一个不懂的人 ,给Ta讲懂了。我做到了。
请有心读者检阅我的知识点有么有错误。
一:什么闭包
首先要理解 js特殊的作用域机制:只能按照作用域链向上访问,而不能访问Ta下级域中的变量。
闭包:就是能够读取其他函数内部变量的函数。 (*^__^*)
一切函数某种环境下都可以当做闭包。
手写一个demo:
function a(){
var s = 1;
function b(){
s++;
}
}
上述中 b函数就是一个闭包。
二:闭包的用途:
1.可以读取函数内部的变量 2 使这些变量保存在内存中
举栗子:
var li = document.getElementsByTagName("li");
for(var i=0;i<5;i++){
li[i].onclick = function(){
alert(i);
}
}
这样运行结果是:每次弹出5; 原因是:当点击alert i的值为最后运算完的值。
修改方法一:
匿名函数自调用;
var li = document.getElementsByTagName("li");
for(var i=0;i<5;i++){
(function(arg){
li[i].onclick = function(){
alert(arg);
}
})(i);
}
-----------------分割线 -------------------
将变量 i 保存给在每个段落对象(p)上
1 2 3 4 5 6 7 8 9 |
|
2、将变量 i 保存在匿名函数自身
1 2 3 4 5 6 7 8 |
|
3、加一层闭包,i以函数参数形式传递给内层函数
1 2 3 4 5 6 7 8 9 10 |
|
4、加一层闭包,i以局部变量形式传递给内存函数
1 2 3 4 5 6 7 8 9 10 11 |
|
5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)
1 2 3 4 5 6 7 8 9 10 |
|
6、用Function实现,实际上每产生一个函数实例就会产生一个闭包
1 2 3 4 5 6 |
|
7、用Function实现,注意与6的区别
1 2 3 4 5 6 |
|