以下执行的js代码中,代码执行完毕,变量得到释放了吗? javascript内存闭包jsfunction 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你事件要触发,你释放了就出错了(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 = ''; } target.getElementsByTagName('a')[0].className = 'current'; } }}());那你不要引用外界的变量不就行了 函数在执行的时候会生成一个active object和scope chain object。在你的代码中,闭包和一般执行的函数会生成一套自己的active object 和scope chain。其中,闭包的不被释放。所以,以上的方法没有使用闭包。也就不存在不释放的问题 请教的简单的js正则表达式,如何匹配非空内容(包含空格,换行符) 请教一个php extjs 的问题 onblur与onchange的区别 如何理解javascript中的对象 图片单击问题 动态获取列表框中的内容 高手来指点 求助 图片在线编辑 请问怎样处理ActiveX控件的事件 关于鼠标捕捉的问题???(欢迎出出点子) EXTJS4 中bbar的store加载问题 请教 两端js代码的区别
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 = '';
一般情况下我们是不用考虑这个的,但既然你想知道,就示例一种可以释放资源的方式吧:(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变量可以得到释放
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';
}
}
}());那你不要引用外界的变量不就行了