鱼C论坛

 找回密码
 立即注册
查看: 2879|回复: 3

[已解决]js函数调用

[复制链接]
发表于 2019-7-3 13:16:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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();                               
}
最佳答案
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 不会销毁。会保存在内存中,这也是使用闭包不当会引起内存泄露的原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-3 14:35:14 | 显示全部楼层
鱼油,如果会用 chrone,开发者模式,调试一下就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-3 14:42:37 | 显示全部楼层
不知道怎么调试呢,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 不会销毁。会保存在内存中,这也是使用闭包不当会引起内存泄露的原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 13:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表