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个匿名函数了呢?
但是疑惑的是这样还可以继续触发鼠标移动事件吗?对闭包不是很了解,之前接触的闭包都是使用一个全局变量进行赋值调用,对于事件调用没接触过,在此函数中运行机制是怎样的?

解决方案 »

  1.   

                    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);//外层匿名函数后面加()是立即调用执行
                    }