JavaScript:是否可以获取当前命名空间的内容?

时间:2010-08-19 16:58:00

标签: javascript namespaces

正如问题所示 - 是否可以获取当前名称空间中声明的所有变量的名称?例如,像这样:

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

3 个答案:

答案 0 :(得分: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 :(得分: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. 通过其他一些过滤数组剥离您不想要的成员

答案 2 :(得分:-1)

您可以获取当前函数范围的来源,如下所示:

arguments.callee.toString()

所以我想你可以解析那个字符串,匹配“var”和“function”之类的东西,从那时起匹配到“;”或“}”

但那将是一个非常混乱,蛮力的方法!如果你真的需要获得这种信息,你最好不要创建变量 - 将每个值和函数定义为对象属性,然后你可以简单地用for(obj中的键)来迭代它们