我想动态地运行代码,而不使用<script>
,所以我使用了new Function
,但是写\n
时出现了问题:
function run (code) {
(new Function(code))()
}
run('console.log("run well")') // it work well
run('console.log("\nError")') // error
结果是: error
Uncaught SyntaxError: Invalid or unexpected token
at new Function (<anonymous>)
at run (<anonymous>:2:3)
at <anonymous>:1:1
我们可以在控制台中找到原因:'\ n'已换到新行
(function() {
console.log(" // error here
Error")
})
因此使用`替换“ 可以解决此问题:
run(`console.log("\nWell")`)
(function() {
console.log(` // work here
Error`)
})
但是在生产中使用`是不合适的,那么是否还有其他方法可以使它做好呢?
答案 0 :(得分:2)
由于函数主体是字符串,因此\n
实际上将转换为换行符。您需要使用\\n
对其进行转义。
function run(code) {
(new Function(code))()
}
run('console.log("run well")') // it work well
run('console.log("\\nError")') // error
答案 1 :(得分:1)
这是因为您忘记将\n
转换为\\n
。
您可以将代码重新编写为
function run (code) {
(new Function(code))()
}
run('console.log("run well")')
run('console.log("\\nError")')
控制台将为
运行良好
错误
请尝试此操作,您将获得输出。
注意以下是转义字符的详细信息
JavaScript使用\(反斜杠)作为转义符,用于:1 [2]
答案 2 :(得分:0)
我建议您将其固定在功能级别上,而不是将所有输入都固定到功能上
您可以修改函数以通过\n
转义任何str.replace
function run(code) {
(new Function(code.replace(/\n/g, "\\n")))()
}
这将避免\n
到code
中\\n
的{{1}}出现任何次数。
希望这会有所帮助!