“ \ n”不能在new Function()中运行

时间:2018-07-02 02:50:42

标签: javascript function

我想动态地运行代码,而不使用<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`)
})

但是在生产中使用`是不合适的,那么是否还有其他方法可以使它做好呢?

3 个答案:

答案 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]

  • \'单引号
  • \“双引号
  • \反斜杠
  • \ n新行
  • \ r回车符
  • \ t标签
  • \ b退格
  • \ f表单供稿
  • \ v垂直选项卡(Internet Explorer 9和更早版本将'\ v视为'v而不是垂直选项卡('\ x0B)。如果考虑跨浏览器兼容性,请使用\ x0B而不是\ v。)< / li>
  • \ 0空字符(U + 0000 NULL)(仅当下一个字符不是十进制数字时;否则它是八进制转义序列)
  • 请注意,JSON字符串中不允许\ v和\ 0转义。

more details about escape characters

答案 2 :(得分:0)

我建议您将其固定在功能级别上,而不是将所有输入都固定到功能上

您可以修改函数以通过\n转义任何str.replace

function run(code) {
    (new Function(code.replace(/\n/g, "\\n")))()
}

这将避免\ncode\\n的{​​{1}}出现任何次数。

希望这会有所帮助!