正如問題所示 - 是否可以獲取在當前命名空間中聲明的所有變量的名稱?例如,像這樣:JavaScript:是否可以獲取當前名稱空間的內容?
>>> var x = 42; >>> function bar() { ...} >>> getNamespace() { x: 42, bar: function(){} } >>>
正如問題所示 - 是否可以獲取在當前命名空間中聲明的所有變量的名稱?例如,像這樣:JavaScript:是否可以獲取當前名稱空間的內容?
>>> var x = 42; >>> function bar() { ...} >>> getNamespace() { x: 42, bar: function(){} } >>>
function listMembers (obj) {
for (var key in obj) {
console.log(key + ': ' + obj[key]);
}
}
// get members for current scope
listMembers(this);
這可以得到一點毛茸茸的,如果你在全球範圍內(例如window
對象。)是。它還會返回內置的和原型的方法。您可以通過抑制這種:
propertyIsEnumerable()
或hasOwnProperty()
delete
屬性(true
主要是指內置的,雖然這可能是不穩定的用戶創建的,false
手段)不幸的是,這不起作用。考慮:'function foo(){var bar = 42; listMembers(本); }' - 在這種情況下,'this'與'bar'的定義沒有任何關係。 – 2010-08-19 18:01:09
不可能在大多數實現中。雖然在Rhino中,您可以通過__parent__
訪問激活對象。
js> function f(){ var x,y=1; return (function(){}).__parent__ }
js> uneval([v for(v in Iterator(f()))])
[["arguments", {}], ["x", , ], ["y", 1]]
有關詳情,請參閱http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/。
您可以獲得當前功能範圍之源,是這樣的:
arguments.callee.toString()
所以我想你可以分析該字符串,匹配的東西,如「無功」和「功能」,匹配從那時起到「 ;」或「}」
但是,這將是一個非常混亂,蠻力的方法!如果你真的需要得到這種信息,你最好不要創建變量 - 定義每個值和函數作爲對象屬性,然後你可以簡單地遍歷它們(for key)
這將返回調用函數的源代碼,但不會返回名稱空間。 – 2012-02-26 04:36:00
重複的http://stackoverflow.com/questions/2051678/getting-all-variables-in-scope,雖然用不同的措辭。 – syockit 2010-08-19 17:36:11