声明Javascript变量的所有可能方法
All possible ways to declare Javascript variables
要创建一个IDE,该IDE将自动完成用户声明的所有变量,但将忽略其他变量,如Math.PI
甚至模块Math
,该IDE需要能够识别与用户声明的变量相关的所有标识符。假设您已经可以访问程序的AST(抽象符号表),那么可以使用什么机制来捕获所有这些变量?
我正在使用reflect.js(https://github.com/zaach/reflect.js)以生成AST。
我认为这几乎是不可能的
这就是为什么我认为不执行它几乎是不可能的:
让我们从简单到困难地浏览尚未探索的部分。
易于捕捉:
此处缺少功能范围:
(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能够处理任何,但这些。由于它们是迄今为止最常见的,我认为计算这些是完全合理的。
通过将它们添加到已经存在的对象上。。。。即
window.mynewvar=5;
function mynewfunc() {
}
相关文章:
- 有可能过滤来自嵌入式YouTube的声音吗
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- Livereload for node.js.有可能吗
- 有可能在来自链接的警报中有一个值吗
- 有可能通过sessionID获得快速会话吗
- 正在对已提取的文档进行填充.有可能吗?如果有,怎么做
- 有可能得到一个大整数实例的自然日志吗
- Ajax与jQuery同步.有可能吗
- 如何使一个Math.random数组元素比另一个数组元素更有可能被选中
- 是否有可能在 JavaScript 中使用异步方法进行迭代
- 有可能“翻转”吗?帆布画吗?还有其他的变通方法吗?
- 使用GET方法选择表单——是否有可能有一个不向URL添加任何内容的选项?
- 是否有可能发送我的对象与方法(函数)从服务器到客户端
- 是否有可能使用任何方法执行javascript代码
- 是否有可能获得createTextNode方法来呈现html标记?
- 想要为更大尺寸的光标使用自定义图像.解决这个问题的方法是什么?有可能用javascript来做吗?
- 有可能只从jQuery中导入Ajax方法吗?
- 有可能在没有目标的方法上使用dojo方面吗?
- 是否有可能在运行时动态地向模型添加方法?
- 是否有可能动态调用一个不存在的方法,然后创建它