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");
})()');
我知道 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");
})()');