考虑以下代码,
function destroyer(obj){
obj = undefined;
}
abcObj = {
a:1,
b:2
}
destroyer(abcObj);
据我所知,我所能做的就是将对象扔出范围,GC会在看到合适时将其清理干净。但是上面的代码并没有将对象抛出范围。
如何强制某个对象超出范围?
希望这样做的原因:我想要实现的是一个具有静态方法destroy
的类来销毁同一个类的实例。这可能在JavaScript中?或者是我无法强制进行清理。一个清理方法会很棒,因为我工作的lib会产生很多像200到300的实例。
答案 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);