如何在javascript中手动销毁对象?

时间:2017-10-25 11:06:10

标签: javascript

考虑以下代码,

function destroyer(obj){
  obj = undefined;
}

abcObj = {
  a:1,
  b:2
}

destroyer(abcObj);

据我所知,我所能做的就是将对象扔出范围,GC会在看到合适时将其清理干净。但是上面的代码并没有将对象抛出范围。

如何强制某个对象超出范围?

希望这样做的原因:我想要实现的是一个具有静态方法destroy的类来销毁同一个类的实例。这可能在JavaScript中?或者是我无法强制进行清理。一个清理方法会很棒,因为我工作的lib会产生很多像200到300的实例。

4 个答案:

答案 0 :(得分:3)

您必须修改指向它的所有变量。

abcObj = null;

您无法使用函数执行此操作,因为这会将值复制到新变量并保持原始状态不变。

这可能毫无意义,因为如果没有它们自然地超出范围,你不太可能创建大量的对象。 99.9%的时间你可以专注于编写代码来完成你需要它做的事情,并让JS引擎在自己的时间内担心垃圾收集。

答案 1 :(得分:1)

因为全局定义只是直接销毁它:

function destroyer(){
  abcObj = undefined;
}

abcObj = {
  a:1,
  b:2
}

console.log(abcObj);

destroyer();

console.log(abcObj);

答案 2 :(得分:0)

JavaScript中有delete,但它不删除对象,它会从对象中删除属性。对于您的特定用例,可以使用它:



function destroyer(name){
    delete window[name];
}

test="hello";
console.log(test);
console.log("before destroy");
destroyer('test');
console.log("after destroy");
console.log(test);




它有效,因为你有一个全局变量," global"范围实际上是" window"在浏览器中。

然而,在一般情况下,您可以做的最多是将对象显式放入某个容器对象,然后您可以从那里删除它们。它不值得恕我直言。

编辑:实际上它不能作为代码片段在这里工作,因为它有自己的" global-ish"范围,不是窗口。但您可以在浏览器的开发者控制台中对其进行测试。

EDIT2 :我错了,它也在这里工作,只是因为冗长的错误信息而感到困惑。在驱逐舰召唤之前和之后添加了日志行。

答案 3 :(得分:0)

您可以将对象中的变量作为键传递,并将该对象传递给驱逐舰函数。这样,您的函数可以使用对象的第一个键来检索全局变量的名称,然后在窗口对象中将其删除。

请注意,这仅适用于全局变量。



// retrieves the first key of the object passed as parameter
function getFirstKeyName(someObject){
  return Object.keys(someObject)[0];
}

// destroy a global variable by its name
function destroyGlobalVariable(withinAnObject){
  // retrieve the variable's name
  var globalVarName = getFirstKeyName(withinAnObject);
  console.log("Deleting global variable " + globalVarName);
  // use delete, assign undefined or null to window[globalVarName]; 
  delete window[globalVarName];
}

abcObj = {
  a:1,
  b:2
}

// abcObj should be defined : 
console.log(abcObj);

// pass your variable name into an object, as a key
destroyGlobalVariable({abcObj});

// abcObj should not be defined now : 
console.log(abcObj);