当前位置:首页 > 开发 > Web前端 > JavaScript > 正文

js delete 删除机理以及它的内存泄露问题的解决方案

发表于: 2015-06-02   作者:换个号韩国红果果   来源:转载   浏览:
摘要: delete删除属性时只是解除了属性与对象的绑定,故当属性值为一个对象时,删除时会造成内存泄露  (其实还未删除) 举例: var person={name:{firstname:'bob'}} var p=person.name delete person.name p.firstname -->'bob' // 依然可以访问p.firstname,存在内存泄露
delete删除属性时只是解除了属性与对象的绑定,故当属性值为一个对象时,删除时会造成内存泄露  (其实还未删除)
举例:
var person={name:{firstname:'bob'}}
var p=person.name
delete person.name
p.firstname  -->'bob'
// 依然可以访问p.firstname,存在内存泄露!!
 

解决方法,用递归!!
//为何不刚开始就将deleteprop设为递归函数??因为它只有一个值,而若它是对象则内层属性可能存在多个,递归的条件是1. 子问题须与原始问题为同样的事,且更为简单:2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
不满足第一条,故必须在内层设置deleteDeep为递归函数!!
function  deleteprop(prop){
	//var current=obj;
	if(typeof prop ==='object')
		deleteDeep(prop)
	
	else
		delete prop;
	function  deleteDeep(current){// 递归函数,循环属性值,对于每一个值,若依然为对象则进行递归
		for(var i in current){
			if(typeof current[i] ==='object')
				deleteDeep(current[i])//或者用  arguments.callee(current[i])
			else
				delete current[i];//expert出口
		}
	}
	
}

举例:
person={name:{
first:'bob',
last:'amy',
relative:{
           mother:'amy',
           father:'peter'}
              }
         }

var p=person.name.relative;//注意:对象拷贝是引用不是拷贝
p  -->{
           mother:'amy',
           father:'peter'}
              }
deleteprop(person.name)

p-->{}//说明已删除!!
由此解决了delete的内存泄露问题

js delete 删除机理以及它的内存泄露问题的解决方案

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
原文地址:http://www.aliued.cn/?p=2908#more-2908 Javascript有没有内存泄露?如果有,如何避免?
有关JS的内存泄露 在JS开发中,JS泄露问题比较麻烦! 主要有4中泄露模式: 1,循环引用 2,闭包的使
使用了JSTL的时候,发现了会有内存泄露 这明显是JSTL泄露,看到一blog http://dreamlakyxy.iteye.co
在最近一个项目中,在项目发布之后,发现系统中有内存泄漏问题。表象是堆内存随着系统的运行时间缓
转自:http://rayleeya.iteye.com/blog/1956638 无论怎么小心,想完全避免 bad code 是不可能的,此
在最近一个项目中,在项目发布之后,发现系统中有内存泄漏问题。表象是堆内存随着系统的运行时间缓
最近发现JDK6的版本中有一个比较大的bug,发现问题及解决问题如下: 首先使用jmap将进程的堆栈信息
问题的提出 Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程
内存泄露是指程序在运行过程中动态申请的内存空间不再使用后没有及时释放,从而很可能导致应用程序
系统对外提供的Solr查询接口,在来自外部调用的压力加大之后,就会出现solr查询报Read Timed Out的
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号