JS在外部函数循环中使用闭包的问题

comcdm 2018-01-21 09:54:06
function tab(obj){
var target = document.getElementById(obj);
var spans = target.getElementsByTagName("span");
var lis = target.getElementsByTagName("li");
for(var i=0;i<spans.length;i++)
{

spans[i].onmouseover = function (num) {
return function(){
for(var j=0; j<spans.length;j++)
{
spans[j].className = "";
lis[j].className = "";
}
spans[num].className = "current";
lis[num].className = "show";
}
}(i);


}


函数如上,如果我调用此函数,外部函数循环运行之后,return 里面的匿名函数,因为num的参数赋值是在外部函数作用域内,使得外部函数并没有被删除而是继续保存在内存中,是否现在已经存在i=0-5的6个匿名函数了呢?
但是疑惑的是这样还可以继续触发鼠标移动事件吗?对闭包不是很了解,之前接触的闭包都是使用一个全局变量进行赋值调用,对于事件调用没接触过,在此函数中运行机制是怎样的?
...全文
554 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2018-01-21
  • 打赏
  • 举报
回复
for(var i=0;i<spans.length;i++) { spans[i].onmouseover = function (num) {//这个外层匿名函数是立即执行的,利用它来产生闭包 return function(){//这个内层匿名函数处于闭包内,在任何时候都能访问到它所在的环境内的num变量,它会作为外层匿名函数的返回值,返回给onmouseover事件,它才是真正的事件处理函数 for(var j=0; j<spans.length;j++) { spans[j].className = ""; lis[j].className = ""; } spans[num].className = "current"; lis[num].className = "show"; } }(i);//外层匿名函数后面加()是立即调用执行 }

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧