个人觉得靠删除节点或内容没什么用,因为一段js代码加载后不过是一段文本,它的开销在加载过程中可能会比较大,但是一旦加载,那就已经是驻留在浏览器端的本地了,这段文本不运行的时候占不了多少空间吧。而且方法一旦运行完那也结束了方法的生命周期,在下次调用前,也不过是一段文本。
反而如果你的代码结构不合理,比如频繁的用分支、嵌套循环反而会造成内存消耗过大。所以建议还是从代码优化着手:
比如,可以把一些比较耗时的逻辑运算放在后台(服务器)运行,而页面只作相应的布局、展示操作。并且前端、后台通过ajax交互。
另外,像你所说的删除js节点,不知道以下方式可不可行:
1.将script节点的src重定向,定向到一个空白的js文件,这样相当于被空杯文件覆盖了;
2.上面那个重定向的方法我也不知道存不存在,不过如果你的js文件可以扔进一个iframe里的话,那就没问题了,重定向iframe肯定是可以的;
最后,祝你好运!
递归方法是不会使用同一个栈帧,每一次递归调用,都将压入新的栈帧,并且这个栈帧上又new了一个新的变量,随着栈深度的增加, 方法里维持着一条长长的方法调用轨迹以便你能回来,在方法没有返回之前,这些所有的变量一直被各自的栈帧引用着,如果不是必要,或者不确定深度的情况下,最后不要用递归。希望采纳前端开发,热爱生活var call = function(x) {
console.log(x++)
setTimeout(function() { call(x)}, 1)
}
call(0)
以这段代码为例,的确x这个变量会一直存在在内存之中,但这么一个变量还不至于让内存达到溢
出。并且可以在chrome Dev Tool中模拟一次垃圾回收结果:
可以看到js heap一直在增加可以看到js heap一直在增加
但是console 依然在跑,其实这已经算是内存泄露了。但是console 依然在跑,其实这已经算是内存泄露了。
如果内存会周期性地按时增长,泄露最终将导致浏览器变慢或者停止执行脚本。从性能优化角度来讲已经是不得不做的事情了。是想如果循环执行的代码中包含了一个大数组new Array(1000000).join('*'),那是非常危险的。
一般setTimeout递归是在做轮询,这会需要给一个结束条件,执行clearTimeout。