我认为这几乎是不可能的
以下是我认为在不执行它的情况下几乎不可能的原因:
让我们从易到难地遍历未探索的部分。
易于捕捉:
函数作用域在此处被忽略:
(function(x){
x;
})({a:3});
这里有一些有趣的技巧分享给大家:
介绍一下...鼓点声...块级作用域!!
with({x:3}){
x;//x is now declared in the scope of that with and is equal to 3.
}
try{ throw 5}catch(x){
x // x is now declared in the scope of the try block and is equal to 5;
}
(读者请注意:我恳求您不要在实际的代码作用域中使用这两个方法:)
不容易:
方括号表示法:
var n = "lo";
a["h"+"e"+"l"+n] = "world"; // need to understand that a.hello is a property.
// not a part of the ast!
真正困难的部分:
我们不要忘记调用编译器这些在AST中不会显示:
eval("var x=5")
new Function("window.x = 5")()
在node.js中,这也可以使用vm模块完成。在浏览器中,可以使用document.write或脚本标记注入。当然,他们还可以尽可能地混淆代码。
new Function(["w","i","n","dow.x"," = ","5"].join(""))(); // Good luck finding this!
new Function('new Function(["w","i","n","dow.x"," = ","5"].join(""))()')();// Getting dizzy already?
那么该怎么办呢?
- 在更新符号表(仅相关部分)时,在一个封闭的、定时的环境中执行代码。
- 查看从执行中生成的符号表。
- 嘭,你就得到了一个符号表。
这并不可靠,但它可能是你能得到的最接近结果。
我所能想到的唯一其他选择——也是大多数IDE所做的——就是简单地忽略任何非:
object.property = ...
var a = ...
b = ...
function fn(){
object["property"]
还有,函数参数。
我没有看到过任何一款IDE能够处理除此以外的内容。因为它们是迄今为止最常见的,所以我认为将它们计算在内是完全合理的。
m
被声明了。a
、b
和c
不是变量,它们是对象的属性。 - gen_Erick
已经声明了,它是全局的。 - gen_Eric