写沙箱的时候遇到的问题
with(new Proxy(
{ a: 1, eval /* 同名传入 */ },
{ has: () => true }
)) {
(function () {
return eval("a")
})()
}
// 输出 1
with(new Proxy(
{ a: 1, _eval: eval /* 不同名传入 */ },
{ has: () => true }
)) {
(function () {
return _eval("a")
})()
}
// 报错 `Uncaught ReferenceError: a is not defined`,为什么?
如果你间接地使用 eval(),比如通过一个引用来调用它,而不是直接地调用 eval,那么从 ECMAScript 5 起,它工作在全局作用域下,而不是局部作用域中。这就意味着,_eval 中的这些代码在执行期间不能访问在with作用域中的局部变量。
mdn