Javascript 如何获取当前范围中定义的所有变量的列表?

Javascript 如何获取当前范围中定义的所有变量的列表?,javascript,eval,scope,state,Javascript,Eval,Scope,State,我希望能够得到当前范围内所有变量的列表。我知道这可能是不可能的(例如,但它确实有助于简化我目前正在研究的节点/浏览器库的解析算法) 有一件事:它不需要打印,也不需要“缩小” 我想通过阅读JS库并动态地evaling它,找出两者之间的状态差异,来找出引入了哪些变量。我知道这种方法在纸面上听起来很糟糕(我很熟悉eval的仇恨),但如果有更好的方法来找到它,而不仅仅是简单地解析整个库(这对于C/等以外的任何语言来说都很慢),我洗耳恭听 如果你对公然使用eval大发雷霆,我知道使用闭包来保护父作用域不

我希望能够得到当前范围内所有变量的列表。我知道这可能是不可能的(例如,但它确实有助于简化我目前正在研究的节点/浏览器库的解析算法)

有一件事:它不需要打印,也不需要“缩小”

我想通过阅读JS库并动态地
eval
ing它,找出两者之间的状态差异,来找出引入了哪些变量。我知道这种方法在纸面上听起来很糟糕(我很熟悉eval的仇恨),但如果有更好的方法来找到它,而不仅仅是简单地解析整个库(这对于C/等以外的任何语言来说都很慢),我洗耳恭听


如果你对公然使用
eval
大发雷霆,我知道使用闭包来保护父作用域不被修改。如果eval在浏览器环境中(临时更改一些DOM构造函数),我还可以防止浏览器显示在eval中的更改。

是和否。“否”在几乎所有情况下,如果您想检查全局范围,请选择“是”,但仅限于有限的方式。以下面的示例为例:

var a = 1, b = 2, c = 3;

for ( var i in window ) {
    console.log(i, typeof window[i], window[i]);
}
在150多件其他事情中,输出以下内容:

getInterface function getInterface()
i string i // <- there it is!
c number 3
b number 2
a number 1 // <- and another
_firebug object Object firebug=1.4.5 element=div#_firebugConsole
"Firebug command line does not support '$0'"
"Firebug command line does not support '$1'"
_FirebugCommandLine object Object
hasDuplicate boolean false
getInterface函数getInterface()
在几乎所有情况下,我都会使用字符串i//Yes和no。“Yes”,但如果要检查全局范围,则只能使用有限的方式。以下面的示例为例:

var a = 1, b = 2, c = 3;

for ( var i in window ) {
    console.log(i, typeof window[i], window[i]);
}
在150多件其他事情中,输出以下内容:

getInterface function getInterface()
i string i // <- there it is!
c number 3
b number 2
a number 1 // <- and another
_firebug object Object firebug=1.4.5 element=div#_firebugConsole
"Firebug command line does not support '$0'"
"Firebug command line does not support '$1'"
_FirebugCommandLine object Object
hasDuplicate boolean false
getInterface函数getInterface()


i string i//这是否有效:
var self=this;for(self中的var i)console.log(i,typeof self[i],self[i])
?我不认为会,但这可能吗?我的计算机上目前没有javascript,所以我无法验证。但它可能……这是可以尝试的!这确实有效。我将把它作为一个答案发布。实际上,这与
窗口[I]
技巧相同……这是否有效:
var self=this;for(self中的var i)console.log(i,typeof self[i],self[i]);
?我不希望这样,但这可能吗?我的计算机上目前没有javascript,所以我无法验证。但它可能……那将是一个值得尝试的东西!这确实有效。我将把它作为一个答案发布。实际上,这与
窗口[i]相同
trick…听起来你想使用一个合适的IDE…这与我目前正在开发的应用程序有关,一个以节点和浏览器为目标的JS编译器。也许这会给你一点背景知识。另外,我完全意识到这些类型的存在,但我希望在更像GCC for JS,而不仅仅是一个简单的混淆器。UglifyJS2和闭包编译器在IMO中似乎都没有很好地优化一些东西,并且需要单独的工具来构建和缩小,这没有什么意义。所以你的意思是你实际上在处理要传输的javascript的语法树?你需要更清楚的是,每个人都假设您正在执行代码并希望以编程方式访问作用域。不一定。每个人的假设都非常正确,但我将在这里发布我自己的答案(我基本上是在寻找)。如果您使用的是
eval
,并且实际正在执行(副作用)在transpiler中编写代码,然后我真的哭了。听起来你想使用一个合适的IDE…这与我目前正在开发的应用程序有关,一个以节点和浏览器为目标的JS编译器。也许这应该提供一点背景。另外,我完全意识到这些类型的存在,但我正在寻找一个从更像GCC for JS的意义上讲,它的功能更全面,而不仅仅是一个简单的模糊器。UglifyJS2和闭包编译器在IMO中似乎都没有很好地优化一些东西,并且需要单独的工具来构建和缩小,这没有什么意义。所以你的意思是你实际上在处理要传输的java的语法树脚本?您需要更清楚地说明这一点,每个人都假设您正在执行代码并希望以编程方式访问范围。不一定。每个人的假设都非常正确,但我将在这里发布我自己的答案(我基本上是在寻找答案)。如果您使用
eval
,并且实际正在执行(副作用)代码在一个传送机里,那么我真的哭了。