百独托管7500 紫田网络超高转化播放器收cps[推荐]速盾CDN 免实名免备防屏蔽阿里云 爆款特卖9.9元封顶提升alexa、IP流量7Q5团队
【腾讯云】中小企福利专场【腾讯云】多款产品1折起高防 随时退换 好耶数据小飞国外网赚带你月入万元炎黄网络4H4G10M 99每月
香港带宽CN2/美国站群优惠中客数据中心 服务器租用联盟系统移动广告平台 中易企业专场腾讯云服务器2.5折九九数据 工信部正规资质
腾讯云新用户大礼包代金券高价收cpa注册量高价展示【腾讯云】2核2G/9.93起租服务器找45互联 随时退换阿里云 短信服务 验证秒达

[技术交流] 有懂JS的,请教个内存溢出问题 [复制链接]
查看:1736 | 回复:10

215

主题

3924

帖子

5533

积分

落伍者(三羊开泰)

Rank: 3Rank: 3

贡献
458
鲜花
47
注册时间
2007-3-29

QQ绑定落伍手机绑定

发表于 2017-12-9 01:01:10 | |阅读模式 来自 中国浙江杭州
场景是这样的,一个页面, A.PHP 里面需要定时调用AJAX,每隔10秒

然后我想到用setTimeout来递归执行

原理代码如下:

var start = 10;  //计数器,每隔10秒运行一次
var step = -1;
function count()
{
        start += step;
        if(start < 0){
                start = 10;
                AJAX();  //这里调用AJAX方法
                setTimeout("count()",4000);
        }else{
                setTimeout("count()",1000);
        }
       
}
count();

但是实际测试时发现,使用setTimeout来递归时,内存并没有释放,单个页面的内存会一直增加。
然后超过半小时左右,就内存溢出崩溃了。

在这请教下,JS里清内存的方法,还有 有没有什么高效点的方法用来替代setTimeout

对JS不熟悉,百度了半天也没解决。
没站 ,签啥名

5

主题

585

帖子

5164

积分

落伍者(三羊开泰)

Rank: 3Rank: 3

贡献
4140
鲜花
2
注册时间
2001-6-23
发表于 2017-12-9 01:46:18 | 来自 中国湖北武汉
如果只是要定时调用函数,可以用 SetInterval,如果一定要用setTimeout递归,setTimeout的第一个参数不要用字符串形式.比如你直接setTimeout(count,1000)就行了
我是一个潜水员

1862

主题

2万

帖子

23万

积分

落伍者(八仙过海)

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

贡献
1911
鲜花
36
注册时间
2008-5-31

落伍手机绑定落伍者

发表于 2017-12-9 09:06:40 | 来自 中国浙江宁波
我完全不懂啊

47

主题

3380

帖子

600

积分

落伍者(一心一意)

Rank: 1

贡献
1114
鲜花
1
注册时间
2017-10-7

落伍手机绑定落伍者落伍微信绑定

发表于 2017-12-9 09:38:50 | 来自 中国江苏苏州
挺不错的呀。

248

主题

5309

帖子

7058

积分

落伍者(三羊开泰)

Rank: 3Rank: 3

贡献
1265
鲜花
50
注册时间
2005-7-15

落伍草根英雄

发表于 2017-12-9 14:56:10 | 来自 中国河南郑州
}else{cnt();}}

function cnt(){setTimeout(count(),1000);}
大雄你怎么啦打起精神来哟.....

248

主题

5309

帖子

7058

积分

落伍者(三羊开泰)

Rank: 3Rank: 3

贡献
1265
鲜花
50
注册时间
2005-7-15

落伍草根英雄

发表于 2017-12-9 15:03:54 | 来自 中国河南郑州
function 不结束,垃圾不回收,除非手动释放你那个ajax(),你这个递归也没个条件限制,比如加个for,while都行,

所以,跳出fn,让内存释放一下
大雄你怎么啦打起精神来哟.....

215

主题

3924

帖子

5533

积分

落伍者(三羊开泰)

Rank: 3Rank: 3

贡献
458
鲜花
47
注册时间
2007-3-29

QQ绑定落伍手机绑定

 楼主| 发表于 2017-12-9 15:19:48 | 来自 中国浙江杭州
zess 发表于 2017-12-9 15:03
function 不结束,垃圾不回收,除非手动释放你那个ajax(),你这个递归也没个条件限制,比如加个for,while ...

嗯,需要无限循环下去,所以本身逻辑就是死循环的。

你的意思是把settimeout作为一个单独的function去调用?
没站 ,签啥名

215

主题

3924

帖子

5533

积分

落伍者(三羊开泰)

Rank: 3Rank: 3

贡献
458
鲜花
47
注册时间
2007-3-29

QQ绑定落伍手机绑定

 楼主| 发表于 2017-12-9 15:23:16 | 来自 中国浙江杭州
zess 发表于 2017-12-9 15:03
function 不结束,垃圾不回收,除非手动释放你那个ajax(),你这个递归也没个条件限制,比如加个for,while ...

我明白了,把settimeout做成独立function,每次function运行完他会自动回收。

同时ajax每次在请求完成后把XMLHttpRequest清空。
没站 ,签啥名

793

主题

8831

帖子

1万

积分

落伍者(四季发财)

光光

Rank: 4

贡献
2101
鲜花
36
注册时间
2005-4-11

落伍者落伍手机绑定

发表于 2017-12-9 20:17:02 | 来自 中国海南海口
因为你的函数还没结束啊
你把他单独出来

39

主题

1万

帖子

1万

积分

落伍者(四季发财)

XX網獸系知性官

Rank: 4

贡献
1649
鲜花
18
注册时间
2005-7-10

QQ绑定

发表于 2017-12-10 09:11:21 | 来自 中国江苏镇江
[code]    var start = 10;  //计数器,每隔10秒运行一次
    setInterval(function () {
        AJAX();  //这里调用AJAX方法
    },start * 1000);[/code]

简化版,不用使用setTimeout,直接使用setInterval就能实现了。
论坛客服/商务合作/投诉举报:2171544 (QQ)
落伍者创建于2001/03/14,本站内容均为会员发表,并不代表落伍立场!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
落伍官方微信:2030286 邮箱:(djfsys@gmail.com|tech@im286.com)
© 2001-2014

浙公网安备 33060302000191号

浙ICP备11034705号 BBS专项电子公告通信管[2010]226号

  落伍法律顾问: ITlaw-庄毅雄

手机版|找回帐号|不能发帖?|Archiver|落伍者

GMT+8, 2024-4-26 23:05 , Processed in 0.144802 second(s), 33 queries , Gzip On.

返回顶部