【问题标题】:Parse JavaScript and keep track of all variables and their values解析 JavaScript 并跟踪所有变量及其值
【发布时间】:2015-11-23 14:03:42
【问题描述】:

那天晚上我在看Bret Victor's talk "Inventing on Principle",并决定尝试构建他演示的实时 JavaScript 编辑器。当他实现二分搜索时,您可以在18:05 看到它的实际效果。

看起来他从来没有发布过这样的编辑器,但无论如何,我认为我可以学到很多东西来构建这样的编辑器。

这是我目前所拥有的

目前能做什么:

  • 跟踪变量及其值(如果分配为文字)
  • 将它们打印在右侧的同一行
  • 显示解析错误

我正在使用 ElectronAngular 构建应用程序,因此它是一个适用于 OSX 的桌面应用程序,但使用 JavaScript 和 HTML 编写。

对于解析,我使用的是Acorn。到目前为止,它是一个很棒的解析器,但是在它被解析之后真的很难真正运行代码。只允许像 var x = 1 这样的文字赋值是可行的,但是一旦你尝试做像 var x = 1 + 2 这样简单的事情,事情就会变得非常复杂,因为 Acorn 是如何构造解析结果的。

我不想只是 eval 整件事,因为这可能很危险,而且可能有更好的方法来做到这一点。

理想情况下,我可以找到一种安全的方法来评估左侧的代码并以某种方式跟踪所有变量。不幸的是,我的研究表明在 JavaScript 中无法访问私有变量,所以我希望我可以依靠其他开发人员的聪明才智来帮助我。任何有关如何比 Acorn 更好/更轻松地做到这一点的提示将不胜感激。

如果你需要,我的代码库在这里:https://github.com/dchacke/nasherai

【问题讨论】:

  • 我认为您应该缩短提问时间。可以用一句话概括。 如何安全地评估 node.js 中的任意字符串?(除非我遗漏了什么)。
  • 你应该使用 eval,这就是它的用途。哎呀,汗使用 with+eval 作为他们的实时编辑器。这是您正在评估的代码,而不是匿名提交,没有任何风险。
  • @dandavis 不,他绝对不应该使用 eval。如果用户通过运行系统命令擦除硬盘怎么办?
  • @Oleander: eval() 可以很容易地被 require() 或“use strict”中的任何其他词法实体阻止,但是为什么用户会以 root 身份登录并运行可以执行的命令首先是这样的事情?如果你想破坏东西,有更简单的方法,而且我看不到你的沙箱链接如何清理任何实际命令,据我所知,它只能防止词法污染,而且铲子脚本更糟糕,因为它使用了不可能限制的 Function() 而不是 eval()。
  • 你需要观看youtube.com/watch?v=H4sSldXv_S4,其中 resig 基本上解释了如何做你想做的事情。

标签: javascript angularjs node.js parsing electron


【解决方案1】:

尝试sandbox 以安全地评估字符串。

var s = new Sandbox()
s.run( '1 + 1 + " apples"', function( output ) {
  // output.result == "2 apples"
})

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多