2010-08-19 2 views
4

Как возникает вопрос - можно ли получить имена всех переменных, объявленных в текущем пространстве имен? Например, что-то вроде этого:JavaScript: можно ли получить содержимое текущего пространства имен?

 
>>> var x = 42; 
>>> function bar() { ...} 
>>> getNamespace() 
{ x: 42, bar: function(){} } 
>>> 
+2

Дубликат http://stackoverflow.com/questions/2051678/getting-all-variables-in-scope, хотя с другой формулировкой. – syockit

ответ

0
function listMembers (obj) { 
    for (var key in obj) { 
     console.log(key + ': ' + obj[key]); 
    } 
} 

// get members for current scope 
listMembers(this);

Это может получить немного волосатые, если вы находитесь в глобальном масштабе (например window объекта.). Он также вернет встроенные и прототипные методы. Вы можете ограничить это следующим образом:

  1. Использования propertyIsEnumerable() или hasOwnProperty()
  2. Попытки delete свойства (true в основном означает, созданный пользователь, false средств встроенных, хотя это может быть нестабильным)
  3. вскрышных Участниками, знаете, что вы не хотите использовать какую-либо другую фильтрующую матрицу
+0

К сожалению, это не сработает. Рассмотрим: 'function foo() {var bar = 42; listMembers (это); } '- в этом случае' this' вовсе не связан с определением 'bar'. –

2

Невозможно в большинстве реализаций. Хотя в 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/.

-1

Вы можете получить источник текущей области функции, например:

arguments.callee.toString() 

Так что я полагаю, вы могли бы разобрать эту строку, соответствующие вещи, как «вар» и «функция», не сопрягая с тех пор, пока " ;» или "}"

Но это был бы очень грязный, грубый подход! Если вам действительно нужно получить такую ​​информацию, вам лучше не создавать переменные вообще - определить каждое значение и функцию как свойство объекта, тогда вы можете просто перебирать их с помощью (ключ в obj)

+1

Это вернет исходный код вызывающей функции, но не вернет пространство имен. –

Смежные вопросы