Mat*_*haq 12 javascript garbage-collection object new-operator
这样做可以吗?:
function mygetTime()
{
var d = new Date();
return(d.getTime());
}
function wasteSomeMemory()
{
var temp;
for(var count = 0; count < 1000000; count += 1)
{
temp = mygetTime();
}
}
Run Code Online (Sandbox Code Playgroud)
调用wasteSomeMemory()
会导致内存泄漏吗?
那这个呢:
function wasteSomeMemory2()
{
var temp;
for(var count = 0; count < 1000000; count += 1)
{
temp = new Date();
}
}
Run Code Online (Sandbox Code Playgroud)
调用wasteSomeMemory2()
会导致内存泄漏吗?我应该delete temp;
在for循环结束时使用吗?
function wasteSomeMemory2()
{
var temp;
for(var count = 0; count < 1000000; count += 1)
{
temp = new Date();
delete temp;
}
}
Run Code Online (Sandbox Code Playgroud)
T.J*_*der 32
new
并且delete
在JavaScript中没有任何关系(尽管它们与其他语言中完全不同的结构有着令人困惑的相似性).不要担心创建objects(new
)而不显式清理它们,这就是垃圾收集器的工作.
new
用于通过构造函数创建对象.delete
另一方面,用于从对象中删除属性.它与从内存中删除对象无关,除了作为副作用(例如,如果对该对象的唯一未完成引用来自您删除的属性).
正确使用的例子delete
:
var obj = {};
obj.foo = "bar"; // Now `obj` has a property called `foo`
delete obj.foo; // Now it doesn't
Run Code Online (Sandbox Code Playgroud)
你的getmyTime
功能非常好.该Date
对象将成为资格函数返回时立即收回(无论是回收是完全下降到实现).除了有缺陷的实现之外,它不会导致内存泄漏.
您的wasteSomeMemory2
同样不会导致内存泄漏,实际上您无法调用delete temp;
- 您只能删除属性,而不能删除变量.
这里是当你有帮助垃圾收集器了几次,但那些通常不会(在我的经验)有对象属性做,因此不涉及delete
.当你创建函数实例时,它们才会真正出现(如果你正在设置事件处理程序或计时器函数等,这通常很常见).例如,考虑:
function foo() {
var listOfThings = /* ...get a list of things... */;
// ...do something with `listOfThings`...
setInterval(function() {
// ...do something that *doesn't* need `listOfThings`...
}, 1000);
}
Run Code Online (Sandbox Code Playgroud)
因为您分配给定时器的匿名函数setInterval
将在函数调用后继续存在,所以它会保留对函数调用期间范围内所有内容的实时引用(无论是否使用它).这样可以保留listOfThings
指向内存的内容列表.如果计时器功能不需要该列表,那么这是一个问题.listOfThings
如果你知道函数不需要它,你可以通过分配undefined
或者当你完成它时的null
任何内容来释放指向的列表listOfThings
:
function foo() {
var listOfThings = /* ...get a list of things... */;
// ...do something with `listOfThings`...
listOfThings = undefined; // Done with it <== The new bit
setInterval(function() {
// ...do something that *doesn't* need `listOfThings`...
}, 1000);
}
Run Code Online (Sandbox Code Playgroud)
对于事件处理函数等也是如此.无论何时创建函数,它都会"关闭"(保持实时引用)范围内定义的任何内容.因此,如果您不需要这些东西,您可以通过清除它们的引用来确保它们不会留在内存中.(更多:闭包并不复杂)
归档时间: |
|
查看次数: |
16033 次 |
最近记录: |