Возвращение JavaScript в строку eval - PullRequest
0 голосов
/ 16 ноября 2018

Я знаю, что eval - это зло, но в этом случае, пожалуйста, не указывайте это, пожалуйста. Я создаю что-то очень нестандартное, и в моем случае eval - единственное решение (для этого и существует eval).

Моя проблема в том, что return не работает в eval-строках. Браузер выдает и Illegal return statement ошибка. Может ли кто-нибудь объяснить мне, почему это происходит?

Я бы хотел, чтобы эта строка была оценена:

eval(`
  console.log('log this');
  return;
  console.log('DONT log this')
`);

Вот блиц стека для игры с

https://stackblitz.com/edit/angular-8x8p6m?file=src%2Fapp%2Fapp.component.ts

Ответы [ 4 ]

0 голосов
/ 16 ноября 2018

Как уже упоминалось в комментариях, операторы return действительны только внутри функций

Дайте попробовать:

eval('(function (){ 
  console.log("log this");
  return 23;
  console.log("do not log this"); 
})()');
0 голосов
/ 16 ноября 2018

Ваша проблема в том, что вы не в функции:

eval('(new Function("console.log(1);return;console.log(2)"))()');

Журналы 1, но не 2.

0 голосов
/ 16 ноября 2018

Попробуйте ввести console.log('log this'); return; console.log('DONT log this'); в вашем браузере (это в основном то, что eval); он будет жаловаться, потому что вы пытаетесь использовать return вне функции.

Однако вы можете сделать что-то вроде этого:

eval(`
  (() => {
    console.log('log this');
    return;
    console.log('DONT log this');
  })()
`);
0 голосов
/ 16 ноября 2018

Именно поэтому мы используем new Function() вместо eval(), если нам действительно нужно eval() для чего-либо.

Если вы передадите строку в конструктор Function, она автоматически вызовет eval() вЭто.Так что нет необходимости переносить eval And function в одном выражении, это в основном делает одно и то же дважды.

const js_str = `
  console.log('log this');
  return 'ok';
  console.log('DONT log this')
`;

const result = new Function( js_str )();

console.log( result );

Если бы вы могли объяснить, что вы создаете с помощью eval(), возможно, было бы и лучшее решение.

...