正如问题所示 - 是否可以获取当前名称空间中声明的所有变量的名称?例如,像这样:
>>> var x = 42; >>> function bar() { ...} >>> getNamespace() { x: 42, bar: function(){} } >>>
答案 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
对象),这会有点毛茸茸。它还将返回内置和原型方法。你可以通过以下方式来解决这个问题:
propertyIsEnumerable()
或hasOwnProperty()
delete
财产(true
主要是指用户创建的,false
表示内置,但这可能不稳定)答案 2 :(得分:-1)
您可以获取当前函数范围的来源,如下所示:
arguments.callee.toString()
所以我想你可以解析那个字符串,匹配“var”和“function”之类的东西,从那时起匹配到“;”或“}”
但那将是一个非常混乱,蛮力的方法!如果你真的需要获得这种信息,你最好不要创建变量 - 将每个值和函数定义为对象属性,然后你可以简单地用for(obj中的键)来迭代它们