完美 JavaScript 语法在 Eval() 中创建错误
Perfectly fine JavaScript syntax creating error in Eval()
我正在 Node.js 中为多种语言创建一个非常原始的在线 interpreter/compiler 只是为了体验,我 运行 遇到了一个非常奇怪的问题 运行宁JS代码.
当用户发帖时,我接受他们的输入,稍微转义,然后将其直接输入命令行(我知道这是糟糕的做法,但我稍后会转移到一个新系统,它不会涉及到直接CMD)这个转义双引号和\n,\r等
当获得输入时,我child_process.exec
它用命令(是的,我给它一个回调,但它是一个相当长的,我认为没有必要写)
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的builder只有一行:
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
当我使用箭头语法时也会发生同样的事情。我不知道是什么绊倒了它。有什么想法或帮助吗?
是第二个例子中缺少的分号导致了错误。应该是:
let foo = function(x) {
console.log(x);
};
foo(5);
您的构建器似乎正在删除换行符,否则 javascript 可以处理分号缺失的问题。 (有关 js 何时可以自动插入分号的更多说明,请参见 here。)
我认为问题在于您在第二种情况下 }
之后缺少 ;
。通常这不会是一个问题,因为 javascript 将 \n
解释为声明的结尾,但你说你正在删除 \n
,所以这就是它失败的原因。
我正在 Node.js 中为多种语言创建一个非常原始的在线 interpreter/compiler 只是为了体验,我 运行 遇到了一个非常奇怪的问题 运行宁JS代码.
当用户发帖时,我接受他们的输入,稍微转义,然后将其直接输入命令行(我知道这是糟糕的做法,但我稍后会转移到一个新系统,它不会涉及到直接CMD)这个转义双引号和\n,\r等
当获得输入时,我child_process.exec
它用命令(是的,我给它一个回调,但它是一个相当长的,我认为没有必要写)
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的builder只有一行:
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
当我使用箭头语法时也会发生同样的事情。我不知道是什么绊倒了它。有什么想法或帮助吗?
是第二个例子中缺少的分号导致了错误。应该是:
let foo = function(x) {
console.log(x);
};
foo(5);
您的构建器似乎正在删除换行符,否则 javascript 可以处理分号缺失的问题。 (有关 js 何时可以自动插入分号的更多说明,请参见 here。)
我认为问题在于您在第二种情况下 }
之后缺少 ;
。通常这不会是一个问题,因为 javascript 将 \n
解释为声明的结尾,但你说你正在删除 \n
,所以这就是它失败的原因。