学习过用封闭空间写选项卡的实例后,对如下代码感到不知如何理解:
<script>
window.onload=function(){
var oBox = document.getElementById('box');
var aBtn = oBox.getElementsByTagName('input');
var ap = oBox.getElementsByTagName('p');
for(var i=0;i<aBtn.length;i++){
(function (index){
aBtn[index].onclick=function(){
for(var i=0;i<aBtn.length;i++){
aBtn[i].className='';
ap[i].style.display='none';
}
this.className='on';
ap[index].style.display='block';
};
})(i);
}
};
</script>
我知道“在循环里加事件,事件里不能用i”这件事,但尚未想清楚为什么不能用?以及为什么利用封闭空间这种写法,能够解决这个问题?
希望有人能够通过这个例子,把封闭空间的本质和循环事件里不能用i原因的帮我理清楚
你这个是IIFE(Immediately-Invoked Function Expression )
输出:
看个例子:
你随便点击那个都会提示
link 5
, 为什么呢?因为,i
是在循环里面定义的,等你真的触发onclick
事件的时候,循环已经执行完了,这个时候i等于5,根本原因在于:JavaScript's scopes are function-level, not block-level
,用IIFE的意义在于把循环时的变量传递传到IIFE中的匿名function中,形成它自己范围的一个新的变量。这个由点绕,自己多理解吧。
关于闭包,我实在不知道用中文如何描述,我用英语总结一下:
下面的代码,在chrome中打开,我们在第10行和第12行加上断点:
i作为参数传递给匿名function内部变量num, 没有引用外部变量,没有闭包。
里面的匿名function,在未来运行的时候,要用到外部变量num,此时会创建闭包。
闭包的用法很多 网上随便搜一下一堆 面试笔试都喜欢考的东西
然而对于这种框架 如果用jQuery有更容易理解的写法 就是用data把数据全存在外层p上 每次用的时候去取
闭包毕竟有那么一点点内存泄露的危险
最大的作用,防止全局名空间的污染