解决方案 »

  1.   

    你事件要触发,你释放了就出错了(function() {
        var li = document.getElementById('nav').getElementsByTagName('li'),
            i = 0;
        for (; i < li.length; i++) {
            li[i].index = i;
            li[i].onmouseover = function() {
               var li = document.getElementById('nav').getElementsByTagName('li');///重新获取
                for (var j = 0; j < li.length; j++) {
                    li[j].getElementsByTagName('a')[0].className = '';
                }
                li[this.index].getElementsByTagName('a')[0].className = 'current';
            }
        }
       delete li;li=null;//释放原来的
    }());
      

  2.   

    只要那函数不再,变量就释放。
    li[i].onmouseover = '';
      

  3.   

    li的属性保存了函数引用,函数闭包保存了li引用,循环引用下li是不会释放的
    一般情况下我们是不用考虑这个的,但既然你想知道,就示例一种可以释放资源的方式吧:(function() {
        var li = document.getElementById('nav').getElementsByTagName('li'),
            i = 0;
        for (; i < li.length; i++) {
            li[i].index = i;
            li[i].onmouseover = ev(li);
        }
    }());
     function ev(li) {
        return function(){
                for (var j = 0; j < li.length; j++) {
                    li[j].getElementsByTagName('a')[0].className = '';
                }
                li[this.index].getElementsByTagName('a')[0].className = 'current';
        }
    }
    这儿事件绑定处不存在闭包了,外部li变量可以得到释放
      

  4.   

    (function() {
        var liTags = document.getElementById('nav').getElementsByTagName('li'),
            i = 0;
        for (; i < liTags.length; i++) {
            
            liTags[i].onmouseover = function(e) {

    var event = e || window.event;
    // current li
    var target = event.target || event.srcElement;

    // parent node(nav)
    var navTag = target.parentNode;
    var linkTags = navTag.getElementsByTagName("a");
                for (var i = 0; j < linkTags.length; i++) {
                    linkTags[i].className = '';
                }
                target.getElementsByTagName('a')[0].className = 'current';
            }
        }
    }());那你不要引用外界的变量不就行了
      

  5.   

    函数在执行的时候会生成一个active object和scope chain object。在你的代码中,闭包和一般执行的函数会生成一套自己的active object 和scope chain。其中,闭包的不被释放。所以,以上的方法没有使用闭包。也就不存在不释放的问题