`" \ n "` не может работать в `новой функции ()` - PullRequest
0 голосов
/ 02 июля 2018

Я хочу запускать код динамически, без использования <script> ,, поэтому я использовал new Function, но при записи \n:

возникает проблема
function run (code) {
    (new Function(code))()
}

run('console.log("run well")') // it work well
run('console.log("\nError")')  // 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 голосов
/ 02 июля 2018

Я предлагаю вам лучше исправить это на функциональном уровне, чем зафиксировать все входы для функции

Вы можете изменить свою функцию для экранирования любого \n на str.replace

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

Это позволит избежать любого количества вхождений для \n в code на \\n.

Надеюсь, это поможет!

0 голосов
/ 02 июля 2018

Это потому, что вы забыли экранировать \n как \\n.

Вы можете написать свой код как

function run (code) {
    (new Function(code))()
}

run('console.log("run well")')  
run('console.log("\\nError")')   

Консоль будет

хорошо бегать

Error

Пожалуйста, попробуйте это, вы получите вывод.

Примечание. Ниже подробно описываются экранирующие символы

JavaScript использует \ (обратную косую черту) в качестве escape-символа для: 1 [2]

  • одиночная кавычка
  • \ "двойная кавычка
  • \ обратный слеш
  • \ n новая строка
  • возврат каретки
  • \ t tab
  • \ b Backspace
  • \ f подача формы
  • \ v вертикальная табуляция (Internet Explorer 9 и более ранние версии трактует '\ v как' v вместо вертикальной табуляции ('\ x0B). Если важна совместимость с различными браузерами, используйте \ x0B вместо \ v.)
  • \ 0 нулевой символ (U + 0000 NULL) (только если следующий символ не является десятичной цифрой; в противном случае это восьмеричная escape-последовательность)
  • Обратите внимание, что экранирование \ v и \ 0 недопустимо в строках JSON.

подробнее о escape-символах

0 голосов
/ 02 июля 2018

Поскольку тело функции является строкой, \n будет фактически преобразовано в символ новой строки. Вы должны избежать этого, используя \\n.

function run(code) {
  (new Function(code))()
}

run('console.log("run well")') // it work well
run('console.log("\\nError")') // error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...