解决for循环闭包取值问题

来源:互联网 发布:奶茶店销售额大数据 编辑:程序博客网 时间:2024/05/22 08:07

解决for循环闭包取值问题

代码

fuction doanimate(){    for(var i = 0;i < 5;i++){        elment[i].animate({            top:'50px'            },500,'linear',function(){                element[i].css('top','0px');        })    }   }

解析代码

代码目的

很简单,用的是jQuery库,目的是利用for循环,循环一共给5个元素设置动画,然后在动画结束后设置回调函数使其top值立即变为0。

问题

代码实际运行时只执行了animate动画,之后的回调函数没有执行,也就是元素的top值并没有变回0。

原因

animate内部实际上采用的是setInterval,利用时间比来动态移动元素属性占比。因此该方法是异步的。而在js中,遇到异步代码不是立即执行,而是先将它挂起,等同步代码执行完再执行的,这样就导致每一个element[i].animate取到了i的值,但是由于回调函数其实是一个闭包,这就导致回调函数中保存的是整个doanimate函数的变量对象,最终使得每一个回调函数中的i的值都是【5】。

解决方法

function doanimate(){    for(var i = 0;i < 5;i++){        (function(i){            elment[i].animate({                top:'50px'                },500,'linear',function(){                    element[i].css('top','0px');            })        })(i);    }}

解决闭包保存整个变量对象的方法很简单,因为在js中,函数的参数是按值传递的,它传递的就是i当时是那个值,即0~4,因此在animate套上一层匿名函数,这样在每一个for循环中都有一个匿名函数,每一个函数的【i】都为一个具体的值,而当回调函数结束时,所有代码全部执行完,内存回收,解决该问题。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 订了火车票了忘记带身份证怎么办 网上买火车票忘记带身份证了怎么办 网上买的火车票忘记带身份证怎么办 深圳东站不卖站台票要送客怎么办 网吧刷身份证机器突然不好使怎么办 买了个衣服穿起来有点老气怎么办 美股主动退市股票钱怎么办 新注册的微信号被实名认证了怎么办 他出轨对我冷暴力孩子小怎么办 给情人发红包被老婆发现了怎么办一 情人和我出轨被他老婆发现了怎么办 情人老婆再次发我的存在怎么办 给情人还了账他老婆不承认怎么办 天堂1游戏限制IP登录次数怎么办 网易手机将军令绑不了太多号怎么办 当发生噩梦、梦魇等情况时该怎么办 出车祸后全保对方在家里来闹怎么办 轮胎正面凹槽被划了口子怎么办 机票已经买完了护照丢了怎么办 买完机票后护照丢了怎么办 填简历时籍贯写了汉怎么办 深圳公租房住满5年后怎么办 深圳公租房住满6年后怎么办 没单位了个人不想交社保怎么办 北京公租房住满5年后怎么办 部落冲突怎样看账号密码忘了怎么办 摩托车闯红灯4次扣24分怎么办 星巴克金星级会员到期了怎么办 2018年驾照到期换证色弱怎么办 怀孕5个月咳嗽有痰怎么办 广州驾照换证体检视力不过怎么办 驾照12分扣完了怎么办费用标准 驾照体检出绿色盲不能补证怎么办 在交警队驾驶员陈述笔录写错怎么办 学驾照做体检把电话填错了怎么办 驾考中心考场停考预约的考试怎么办 口令卡绑定第一次身份证输错怎么办 第一次去医院看病没带身份证怎么办 考科目二紧张怎么办如何消除紧张 考科目三紧张怎么办如何消除紧张 我的驾考准考证和发票丢了怎么办