Javascript return 在 eval 字符串中

Javascript return in eval string

我知道 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

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

如果您将字符串传递给 Function 构造函数,它将自动对其调用 eval()。所以不需要将 eval 和 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() 创建的内容,甚至可能还有更好的解决方案。

你的问题是你不在函数中:

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

记录 1 但不记录 2。

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

但是,您可以这样做:

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

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

试一试:

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