Javascript返回eval字符串

时间:2018-11-16 12:36:43

标签: javascript eval

我知道eval是邪恶的,但是在这种情况下,请不要指出这一点。我正在创建一些非常自定义的东西,在我的情况下,eval是唯一的解决方案(这就是eval的用途)。

我的问题是return在评估字符串中不起作用。浏览器抛出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 :(得分:1)

这就是为什么如果我们确实需要new Function()来使用eval()而不是eval()的原因。

如果将字符串传递给Function构造函数,它将自动在其上调用eval()。因此,无需在同一条语句中包装eval和函数,这基本上是在做同一件事两次。

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

const result = new Function( js_str )();

console.log( result );

如果您可以解释使用eval()创建的内容,那么甚至还有更好的解决方案。

答案 1 :(得分:1)

您的问题是您不在函数中

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

记录1,但不记录2。

答案 2 :(得分:1)

尝试在浏览器中输入console.log('log this'); return; console.log('DONT log this');(基本上就是评估值);它会抱怨,因为您试图在函数外部使用return

但是,您可以执行以下操作:

eval(`
  (() => {
    console.log('log this');
    return;
    console.log('DONT log this');
  })()
`);

答案 3 :(得分:1)

如评论中所述,return语句仅在函数内部有效

尝试一下:

eval('(function (){ 
  console.log("log this");
  return 23;
  console.log("do not log this"); 
})()');