js函数调用
大家好,请教一下几个问题: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);
}
function fnSlide(li){
var oDiv = li.getElementsByTagName('div');
function fnSlideOnce(){
setTimeout(function(){
flag = flag == 0 ? -50 : 0;
doMove(oDiv, 'top', 10, flag, fnSlideOnce);
}, Math.round(Math.random() * 2000 + 1000));
}
fnSlideOnce();
} 鱼油,如果会用 chrone,开发者模式,调试一下就知道了 不知道怎么调试呢, 1、下面代码中,如果有n个li,那么setTimeout中定义的函数是只有一个,还是有n个。
fnSlide 函数执行多少次就定义多少个,也就是 n 个。但是这些定义好的匿名函数在执行结束之后,函数内的变量会被垃圾处理机制回收。
2、doMove中为什么能找到相应的oDiv,是不是因为调用n次fnSlide,内存中就会保存n个oDiv。
这种是js闭包的一个变种,js 中变量是在定义时被确定,定时器中的匿名函数定义时,其函数体内的 oDiv 就是fnSlide 函数执行时获得那个 div,当定时器时间到达而执行匿名函数时,就会顺着作用域链找到当初得到的div。所以虽然 fnSlide 已经执行完毕,但变量 oDiv 不会销毁。会保存在内存中,这也是使用闭包不当会引起内存泄露的原因。
页:
[1]