155 - 《JS 问题的本质解:从 with 语句说起》

发布于 2022年7月19日

背景是昨天辟起(dumi 作者)和有知(qiankun 作者)排查 qiankun 沙箱问题时遇到的知识点。qiankun 沙箱会通过 with(window){} 给子应用的 JS 代码包一层以避免子应用 JS 影响父应用,但这种方式在结合 esbuild 压缩代码时触发了非常巧合的异常,导致页面执行时出错和白屏。

总结成最简复现,就是早上发在群里的题。

const foo = { bar: 1 };
with(foo) { var bar = 2 };
console.log(foo.bar); // 2

为啥 foo.bar 是 2?我用 var 声明了变量而已,为啥会修改外部的值?

const foo = { bar: 1 };
with(foo) { const bar = 2 };
console.log(foo.bar); // 1

再试试 const,为啥 const 行为不一致,只有 var 会触发吗?

const foo = { bar: 1 };
with(foo) { var hoo = 2 };
console.log(foo.hoo); // undefined

为啥这又是 undefined?var 一个 with 对象上不存在的值就不会修改了吗?

with 现在很少用了,但可以借此看

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。