|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好,请教一下几个问题:
1、下面代码中,如果有n个li,那么setTimeout中定义的函数是只有一个,还是有n个。
2、doMove中为什么能找到相应的oDiv,是不是因为调用n次fnSlide,内存中就会保存n个oDiv。
var aLi = document.getElementsByTagName('li'),flag = 0;
for(var i=0; i<aLi.length; i++){
fnSlide(aLi[i]);
}
function fnSlide(li){
var oDiv = li.getElementsByTagName('div')[0];
function fnSlideOnce(){
setTimeout(function(){
flag = flag == 0 ? -50 : 0;
doMove(oDiv, 'top', 10, flag, fnSlideOnce);
}, Math.round(Math.random() * 2000 + 1000));
}
fnSlideOnce();
}
1、下面代码中,如果有n个li,那么setTimeout中定义的函数是只有一个,还是有n个。
fnSlide 函数执行多少次就定义多少个,也就是 n 个。但是这些定义好的匿名函数在执行结束之后,函数内的变量会被垃圾处理机制回收。
2、doMove中为什么能找到相应的oDiv,是不是因为调用n次fnSlide,内存中就会保存n个oDiv。
这种是js闭包的一个变种,js 中变量是在定义时被确定,定时器中的匿名函数定义时,其函数体内的 oDiv 就是fnSlide 函数执行时获得那个 div,当定时器时间到达而执行匿名函数时,就会顺着作用域链找到当初得到的div。所以虽然 fnSlide 已经执行完毕,但变量 oDiv 不会销毁。会保存在内存中,这也是使用闭包不当会引起内存泄露的原因。
|
|