正如问题所述——是否有可能获取当前命名空间中声明的所有变量的名称?例如,像这样:
>>> var x = 42; >>> function bar() { ...} >>> getNamespace() { x: 42, bar: function(){} } >>>
正如问题所述——是否有可能获取当前命名空间中声明的所有变量的名称?例如,像这样:
>>> var x = 42; >>> function bar() { ...} >>> getNamespace() { x: 42, bar: function(){} } >>>
在大多数实现中是不可能的。但是在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/。
function listMembers (obj) {
for (var key in obj) {
console.log(key + ': ' + obj[key]);
}
}
// get members for current scope
listMembers(this);
如果你在全局范围内(例如 window
对象),这可能会变得有点棘手。它还将返回内置和原型方法。您可以通过以下方式控制:
propertyIsEnumerable()
或 hasOwnProperty()
true
大多表示用户创建的,false
表示内置的,尽管这可能不稳定)function foo(){ var bar = 42; listMembers(this); }
— 在这种情况下,this
与bar
的定义根本没有关系。 - David Woleverarguments.callee.toString()
所以我想你可以解析那个字符串,匹配像"var "和"function "这样的东西,从那时开始匹配直到";"或"}"
但那将是非常非常混乱、蛮力的方法!如果你真的需要获取这种信息,最好不要创建变量——将每个值和函数定义为对象属性,然后你可以简单地通过for(key in obj)迭代它们