要创建一个IDE,它将自动完成用户声明的所有变量,但不会忘记其他变量,例如Math.PI
甚至模块Math
,IDE需要能够识别所有标识符与用户声明的变量有关。假设您已经可以访问程序的AST(抽象符号表),可以使用什么机制来捕获所有这些变量?
我正在使用reflect.js(https://github.com/zaach/reflect.js)来生成AST。
答案 0 :(得分:7)
这就是为什么我认为没有执行它几乎是不可能的:
让我们一起探讨未开发的部分,从易到难。
功能范围:
(function(x){
//x is now an object with an a property equal to 3
// for the scope of that IIFE.
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"); // declares x as 5, just a string literal and a function call
new Function("window.x = 5")();// or global in node
在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 = ... //property definition
var a = ... //scoped
b = ... //global, or error in strict mode
function fn(){ //function declaration
object["property"] //property with a _fixed_ literal in bracket notation.
还有功能参数。
我见过没有 IDE已经能够处理任何但这些。由于它们是迄今为止最常见的,我认为计算它们是完全合理的。
答案 1 :(得分:-2)
将它们添加到已存在的am对象上....即
window.mynewvar = 5;
function mynewfunc() {
}