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 现在很少用了,但可以借此看