window.foo
將訪問該全局變量。
this.close=function(){ delete window.foo; }
不過,我記得有something fishy with global variables, delete and window,所以你可能想不這樣做,而只需使用window.foo = null;
例如。
如果您想訪問另一個函數中定義的變量,您需要閱讀this SO question的答案。
因爲你想要的是允許垃圾收集器釋放該對象,你需要確保沒有引用留給對象。這可能非常棘手(即不可能),因爲操縱對象的代碼可以通過全局和局部變量以及屬性對其進行多次引用。
您可以通過創建一個代理來訪問它,但不幸的是,JavaScript不支持動態獲取器和設置器(也稱爲catch-alls)(在某些瀏覽器上可能會實現它,see this SO question ),所以你不能輕易地重定向所有的字段和方法(它們只是字段)來訪問底層對象,特別是如果底層對象有很多字段被添加並動態刪除(例如this.anewfield = anewvalue
)。
這裏是一個smiple代理(上jsfiddle.net代碼):
function heavyobject(destroyself, param1, param2) {
this.id=0;
this.action=function(){alert('tost ' + param1 + "," + param2);};
this.close=function(){ destroyself(); }
}
function proxy(param1, param2) {
object = null;
// overwrites object, the only reference to
// the heavyobject, with a null value.
destroyer = function() { object = null; };
object = new heavyobject(destroyer, param1, param2);
return function(fieldname, setvalue) {
if (object != null) {
if (arguments.length == 1)
return object[fieldname];
else
object[fieldname] = setvalue;
}
};
}
var foo = proxy('a', 'b');
alert(foo("action")); // get field action
foo("afield", "avalue"); // set field afield to value avalue.
foo("action")(); // call field action
foo("close")(); // call field close
alert(foo("action")); // get field action (should be 'undefined').
它的工作原理是返回一個函數,當用一個參數調用,獲取被包裝的對象上的字段,當有兩個參數調用設置一個字段。它的工作原理是確保對重對象的唯一引用是proxy
函數中的object
局部變量。
在heavyobject代碼必須從未泄漏this
(永遠不會返回它,不會返回保持到var that = this
的基準的功能,從來沒有將其存儲到另一個變量的場),否則某些外部參考可以創建將指向重金屬,防止其刪除。
如果重對象的構造函數在構造函數中(或來自構造函數調用的函數)調用destroyself()
,它不會產生任何效果。
另一個更簡單的代理,它將爲您提供一個空對象,您可以在其上添加字段,讀取字段和調用方法。我非常確定,使用這個,沒有外部參考可以逃脫。
代碼(也jsfiddle.net):
function uniquelyReferencedObject() {
object = {};
f = function(field, value) {
if (object != null) {
if (arguments.length == 0)
object = null;
else if (arguments.length == 1)
return object[field];
else
object[field] = value;
}
};
f.destroy = function() { f(); }
f.getField = function(field) { return f(field); }
f.setField = function(field, value) { f(field, value); }
return f;
}
// Using function calls
o = uniquelyReferencedObject();
o("afield", "avalue");
alert(o("afield")); // "avalue"
o(); // destroy
alert(o("afield")); // undefined
// Using destroy, getField, setField
other = uniquelyReferencedObject();
other.setField("afield", "avalue");
alert(other.getField("afield")); // "avalue"
other.destroy();
alert(other.getField("afield")); // undefined
但是,如果它不是一個全局變量? – DerWaldschrat 2012-08-08 13:10:13
,這不會幫助我,因爲變量foo可以通過許多名稱來定義,例如:var foo = new example; var test = new example();在你的情況下,我不能關閉測試變量 – volchkov 2012-08-08 13:11:01
其一個解決方案,但稱它有點不方便,所以我想出了一個更簡單的解決方案。只要我將變量定義爲全局變量,我可以通過window ['foo']訪問它,所以我所做的就是檢查範圍上的所有變量,如果它們中的任何一個具有窗口[i] .id和window [i] .action我刪除它們 – volchkov 2012-08-08 14:07:55