知识卡片

严格模式阻止隐式全局

普通读书笔记卡 · 1498.a.1

内容

未声明赋值会创建全局变量(见 [[隐式全局难调试]]),这只是旧式非严格脚本的行为。严格模式('use strict')和 ES 模块下,给未声明变量赋值会直接抛出 ReferenceError,而非静默创建全局变量。声明规范和 lint 是防线,严格模式是运行时兜底:lint 在编码阶段拦截,严格模式拦截漏网情况,两者互补不可替代。

参考来源

- 位置:《JavaScript语言精粹(修订版)》附录A《毒瘤 Awful Parts》"全局变量"一节;现代行为依据 [MDN 严格模式文档](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode) - 结论依据:原书说明未声明变量赋值会被当作隐式全局变量、导致 bug 难查,但成书年代早于 ES5 严格模式普及;MDN 文档明确严格模式和 ES 模块下对未声明变量赋值会抛出 ReferenceError,二者结合可以推出"声明+lint 是底线,严格模式是运行时兜底"的结论,属于对原书内容的现代版本补充。 - 原始内容:这种方式本来是为方便初学者,有意让变量在使用前无须声明。遗憾的是,忘记声明变量成了一个非常普遍的错误。JavaScript的策略是让那些忘记预先声明的变量成为全局变量,这导致查找bug非常困难。(附录A"全局变量"一节;现代限定引自 MDN 严格模式说明:严格模式下对未声明标识符赋值会抛出 ReferenceError。)