完美的JavaScript语法在Eval()中创建错误

时间:2016-08-19 16:59:52

标签: javascript node.js eval

我在Node.js中为多种语言创建一个非常原始的在线解释器/编译器,仅用于体验,并且在运行JS代码时遇到了一个非常奇怪的问题。

当用户发帖时,我会接受他们的输入,将其稍微转义,然后将其直接输入命令行(糟糕的做法,我知道,但是我会在以后的某个新系统中转移到#39 ; t涉及直接CMD)这会转义双引号和\ n,\ r等等。

在获得输入时,我child_process.exec使用命令(是的,我正在给它回调,但它是一个相当长的,我认为没有必要写)< / p>

let parentResults = cp.exec(`node ./builders/${this.builder}.js "${this.escapedCode}"`);
// First parameter represents the builder to run the user input with
// and escaped code is self-explanatory

处理JS的构建器只有一行:

eval(process.argv[2]); // Already somewhat-escaped code

现在,当我写一些像

这样的东西
function foo(x) {
  console.log(x);
}

foo(5);

我在5的控制台中获得了正确的输出。

但是当我做

之类的事情时
let foo = function(x) {
  console.log(x);
}

foo(5);

我收到错误说

console.log(x); 
  ^

SyntaxError: Unexpected identifier

当我使用箭头语法时也会发生同样的事情。我不知道什么可能绊倒它。有什么想法或帮助吗?

2 个答案:

答案 0 :(得分:3)

我认为问题是你在第二种情况下 private void addNewBubble() { BubbleLayout bubbleView = (BubbleLayout)LayoutInflater.from(MainActivity.this).inflate(R.layout.bubble_layout, null); bubbleView.setOnBubbleRemoveListener(new BubbleLayout.OnBubbleRemoveListener() { @Override public void onBubbleRemoved(BubbleLayout bubble) { finish(); System.exit(0); } }); bubbleView.setOnBubbleClickListener(new BubbleLayout.OnBubbleClickListener() { @Override public void onBubbleClick(BubbleLayout bubble) { Intent in = new Intent(MainActivity.this, PopUpWindow.class); in.putExtra("yourBoolName", isCheckedValue ); startActivity(in); } }); bubbleView.setShouldStickToWall(true); bubblesManager.addBubble(bubbleView, 60, 20); } 之后错过了;。通常它不会成为一个问题,因为javascript会将}解释为声明的结尾,但是你说你要删除\n,所以这就是它失败的原因。

答案 1 :(得分:2)

第二个例子中缺少的分号正在绊倒它。它应该是:

let foo = function(x) {
  console.log(x);
};

foo(5);

您的构建器似乎正在删除换行符,否则将允许javascript处理缺少分号。 (有关js何时可以自动插入分号的更多说明,请参阅here。)