js 传递 eval 到 Proxy 中出现的问题

写沙箱的时候遇到的问题

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`,为什么?
阅读 2.2k
1 个回答

如果你间接地使用 eval(),比如通过一个引用来调用它,而不是直接地调用 eval,那么从 ECMAScript 5 起,它工作在全局作用域下,而不是局部作用域中。这就意味着,_eval 中的这些代码在执行期间不能访问在with作用域中的局部变量。
mdn

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题