以次执行的js代码中,代码执行完毕,变量得到释放了吗
以下执行的js代码中,代码执行完毕,变量得到释放了吗?
小弟也是初学JS,请教一下各位大牛!
代码片段:
我就是想问下这里的 li 变量,当函数执行完成时,有没有得到内存的释放?
我个人认为觉得并没有得到释放,因为 onmouseouver 事件,闭包引用了 li 外面作用域的变量,所以垃圾回收器,标记一直是1,所以没有得到释放。
如果要想释放内存,以上代码应该怎样改呢?
------解决方案--------------------
闭包里面的变量使用完毕后会被清除的


------解决方案--------------------
你事件要触发,你释放了就出错了
------解决方案--------------------
只要那函数不再,变量就释放。
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);
}
}());
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变量可以得到释放
------解决方案--------------------
小弟也是初学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);
}
}());
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变量可以得到释放
------解决方案--------------------
(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 = '';
}