jstips 07:使用 “use strict“ 让 JavaScript 开发更安全、更省心 教程【免费下载链接】jstipsThis is about useful JS tips!项目地址https://gitcode.com/gh_mirrors/js/jstips点击查看免费下载本篇技术指南围绕 jstips 项目第 07 号技巧《使用 use strict 变得懒惰》简体中文版英文原版繁体中文版展开讲解 JavaScript 严格模式的原理、两种启用方式、它带来的六项关键行为变化以及在新旧项目中引入严格模式的注意事项。读完本文你将掌握如何用一行指令把粗心的错误交给引擎自动检查写出更安全、更适合大型项目维护的 JavaScript 代码。什么是严格模式让引擎替你查错JavaScript 默认是相当宽容的。以变量为例非严格模式下你可以在从未使用var声明的情况下直接引用一个变量——这对初学者似乎很方便但当变量名拼写错误、或不小心引用了作用域外的变量时这类宽松行为恰恰是大量隐蔽 bug 的源头。严格模式Strict Mode正是为此而生它把开发者常见的粗心错误直接变成 JavaScript 错误让引擎代替我们做那些无聊但必要的检查工作。正如该 tip 所说程序员喜欢让电脑自动检查工作中的失误use strict指令所做的就是把错误转变成可被及时发现的 JavaScript 错误。两种启用方式脚本级与函数级严格模式的使用方式非常灵活可以作用于整个脚本也可以只作用于单个函数内部。方式一放在 JS 文件顶端启用全脚本严格模式// 全脚本严格模式 use strict; var v Hi! Im a strict mode script!;方式二放在函数体内启用函数级严格模式function f() { // 方法级严格模式 use strict; function nested() { return And so am I!; } return Hi! Im a strict mode function! nested(); } function f2() { return Im not strict.; }注意两个示例的细节差异字符串可以用双引号use strict也可以用单引号use strict效果完全一致函数级严格模式只影响该函数及其内部嵌套函数上例中f()内部运行在严格模式而外面的f2()仍是非严格模式。这种粒度控制正是渐进式引入严格模式的关键手段。严格模式改变的关键行为在 JavaScript 文件或函数内引入该指令后引擎会运行在严格模式下禁用一批在大型项目中通常不受欢迎的行为。原 tip 归纳了以下六项核心变化只有被var及let/const声明过的变量才可以引用—— 未声明直接赋值会抛出ReferenceError而不是悄悄创建全局变量从根源上杜绝拼写错误和隐式全局污染。试图写只读变量只读属性时将会报错—— 例如给NaN、undefined等只读全局属性赋值或写入Object.defineProperty定义为writable: false的属性都会抛出TypeError。只能通过new关键字调用构造函数—— 直接以普通函数方式调用构造函数会报错避免了忘记new导致this指向错误、悄悄污染全局的经典问题。this不再隐式指向全局对象—— 普通函数调用中this为undefined而不是默认绑定到window/global防止无意间读写全局状态。对eval()有更严格的限制——eval内声明的变量不再泄漏到外层作用域也禁止在严格模式的eval中引入新的绑定。防止使用保留关键字含未来保留字命名变量—— 诸如implements、interface、package、private、protected、public、static、yield等词汇不再允许作为变量名为语言未来演进留出空间。严格模式同时还收紧了许多其他危险操作禁止使用with语句、禁止给不可删除属性如函数参数执行delete、禁止八进制字面量010这类写法、禁止函数参数重名、arguments与具名参数不再联动等等。对于追求可维护性的大型项目这些限制都是提前暴露问题的保护机制。新旧项目迁移严格模式的适用场景严格模式对新项目是非常友好的——从一开始就处于严格模式可以避免大量早期隐患。但对从未使用过严格模式的老项目来说引入它是有挑战的老代码中可能广泛存在隐式全局变量、with语句、八进制字面量等非严格模式写法直接开启会让存量代码大面积报错。更隐蔽的风险在构建链中如果你的打包流程把所有 JS 文件拼接成一个大型文件而其中某个文件顶部写了use strict那么该指令会作用于整个拼接后的文件导致所有文件都运行在严格模式下原本局部生效的意图被意外放大。这也是为什么实践上更推荐采用函数级严格模式或逐步迁移而非在拼接产物中一刀切地开启全局严格模式。它是表达式不是声明严格模式指令并不是一条语句statement而是一个字符串字面量表达式——它位于脚本或函数的指令序言Directive Prologue中。正因如此早期版本的 JavaScript 引擎会直接忽略它不会产生语法错误这也让严格模式具备了良好的向后兼容性。原 tip 给出的浏览器支持情况如下Internet Explorer 10Firefox 4Chrome 13Safari 5.1Opera 12以上是 2016 年该 tip 撰写时的支持基线如今主流浏览器与现代 Node.js 均已全面支持严格模式可作为默认启用的首选。与仓库内其他技巧的呼应严格模式与 jstips 仓库中的多条 JavaScript 技巧存在直接关联可以串起来阅读变量提升tip 11讲解var声明提升与赋值不提升的机制而严格模式下未声明即引用会直接抛错二者共同构成了对变量作用域的正确理解。var 与 ES6 的 lettip 59let/const本身就是块级作用域与必须声明后使用的更严格选择配合严格模式使用效果更佳。仓库通过 POST_TEMPLATE.md 规定每篇 tip 的元数据格式tip-number、tip-tldr、categories等本篇为第 07 号 tip完整的技巧索引可在 README.md 中查看。小结让严格模式成为你的默认习惯一句话总结use strict不是魔法而是让 JavaScript 引擎替你把粗心的错误变成明确的报错。在可行的情况下新代码优先开启严格模式、函数级启用作为渐进迁移的过渡手段、并留意构建拼接对严格模式范围的放大效应。让引擎替你做检查你就可以把精力留给真正的业务逻辑——这正是该 tip 标题 get lazy变得懒惰的本意。如需更全面的严格模式行为说明可查阅 MDN 的 Strict mode 文档作为延伸资料。赞分享教程【免费下载链接】jstipsThis is about useful JS tips!项目地址https://gitcode.com/gh_mirrors/js/jstips点击查看免费下载相关推荐Slang 编译器解析器白盒特征化测试指南基于 slang-parser.cpp 的覆盖率缺口测试套件深度解析Slang 编译器解析器白盒特征化测试指南基于 slang parser.cpp 的覆盖率缺口测试套件深度解析 导读 本文聚焦 Slang 编译器slang教程jstips 精讲用 use strict 严格模式写出更安全的 JavaScriptjstips 精讲用 use strict 严格模式写出更安全的 JavaScript 导读 本篇基于 jstips 项目第 07 期技巧 _posts教程终极指南在macOS上免费制作Windows启动盘的完整解决方案终极指南在macOS上免费制作Windows启动盘的完整解决方案 你是否曾经在Mac电脑上需要制作Windows启动盘时感到困惑传统的Boot Camp助手桌面应用上一篇GitHub汉化插件终极指南3分钟让GitHub界面全面中文化下一篇GitHub汉化插件终极指南3分钟让GitHub界面全面中文化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考