日期:2014-05-16  浏览次数:20348 次

以下执行的js代码中,代码执行完毕,变量得到释放了吗?
小弟也是初学JS,请教一下各位大牛!

代码片段:

(function() {
    var li = document.getElementById('nav').getElementsByTagName('li'),
        i = 0;
    for (; i < li.length; i++) {
        li[i].index = i;
        li[i].onmouseover = function() {
            for (var j = 0; j < li.length; j++) {
                li[j].getElementsByTagName('a')[0].className = '';
            }
            li[this.index].getElementsByTagName('a')[0].className = 'current';
        }
    }
}());

我就是想问下这里的 li 变量,当函数执行完成时,有没有得到内存的释放?

我个人认为觉得并没有得到释放,因为 onmouseouver 事件,闭包引用了 li 外面作用域的变量,所以垃圾回收器,标记一直是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;//释放原来的
}());

------解决方案--------------------
只要那函数不再,变量就释放。
li[i].onmouseover = '';
------解决方案--------------------
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);
 &