zjmttt 发表于 2019-7-3 13:16:41

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();                               
}

不二如是 发表于 2019-7-3 14:35:14

鱼油,如果会用 chrone,开发者模式,调试一下就知道了

zjmttt 发表于 2019-7-3 14:42:37

不知道怎么调试呢,

陈立希2570 发表于 2019-7-5 12:54:08

1、下面代码中,如果有n个li,那么setTimeout中定义的函数是只有一个,还是有n个。
fnSlide 函数执行多少次就定义多少个,也就是 n 个。但是这些定义好的匿名函数在执行结束之后,函数内的变量会被垃圾处理机制回收。
2、doMove中为什么能找到相应的oDiv,是不是因为调用n次fnSlide,内存中就会保存n个oDiv。
这种是js闭包的一个变种,js 中变量是在定义时被确定,定时器中的匿名函数定义时,其函数体内的 oDiv 就是fnSlide 函数执行时获得那个 div,当定时器时间到达而执行匿名函数时,就会顺着作用域链找到当初得到的div。所以虽然 fnSlide 已经执行完毕,但变量 oDiv 不会销毁。会保存在内存中,这也是使用闭包不当会引起内存泄露的原因。
页: [1]
查看完整版本: js函数调用