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

4

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

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

2
重复的问题,与https://dev59.com/_HI-5IYBdhLWcg3wBjdR相同,只是措辞不同。 - syockit
3个回答

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/


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. 尝试删除属性(true 大多表示用户创建的,false 表示内置的,尽管这可能不稳定)
  3. 通过某些其他过滤数组剥离您知道不想要的成员

不幸的是,这并不起作用。请考虑以下代码:function foo(){ var bar = 42; listMembers(this); } — 在这种情况下,thisbar的定义根本没有关系。 - David Wolever

-1
您可以像这样获取当前函数作用域的源代码:
arguments.callee.toString()

所以我想你可以解析那个字符串,匹配像"var "和"function "这样的东西,从那时开始匹配直到";"或"}"

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


1
这将返回调用函数的源代码,但不会返回命名空间。 - David Wolever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接