JavaScript中的严格模式(Strict Mode)
字数 641 2025-11-06 12:41:20
JavaScript中的严格模式(Strict Mode)
描述
严格模式是ES5引入的一种JavaScript运行模式,它通过抛出更多错误和禁用部分不安全语法,使代码更安全、更符合现代规范。启用严格模式后,引擎会优化代码执行,避免常见的编码错误。
为什么要用严格模式?
- 消除隐式错误:例如未声明的变量赋值会报错(非严格模式下会创建全局变量)。
- 禁止某些语法:如
with语句、重复的函数参数等。 - 提升性能:限制
eval和arguments的副作用,便于引擎优化。
启用严格模式的方法
- 全局启用:在脚本文件或
<script>标签的顶部添加"use strict";。"use strict"; x = 10; // 报错:x未声明 - 函数内启用:在函数体顶部添加
"use strict";(仅对该函数生效)。function strictFunc() { "use strict"; y = 20; // 报错 }
严格模式的主要变化
-
变量必须声明
"use strict"; x = 1; // ReferenceError: x is not defined非严格模式下会隐式创建全局变量。
-
禁止删除不可删除的属性
delete Object.prototype; // TypeError: Cannot delete property 'prototype' -
函数参数不能重名
function dup(a, a) { "use strict"; } // SyntaxError: Duplicate parameter name -
禁止使用
with语句"use strict"; with (obj) { } // SyntaxError: Strict mode code may not include a with statement -
this默认值为undefined(非严格模式下为全局对象)function showThis() { "use strict"; console.log(this); // undefined } showThis(); -
禁止八进制字面量
"use strict"; let n = 010; // SyntaxError: Octal literals are not allowed -
eval不再泄露变量到外部作用域"use strict"; eval("var z = 1;"); console.log(z); // ReferenceError: z is not defined -
禁止对只读属性(如
arguments.caller)赋值"use strict"; arguments.caller = "test"; // TypeError
严格模式的注意事项
- 如果代码依赖非严格模式特性(如全局变量自动创建),启用严格模式可能导致错误。
- 合并脚本时,若部分代码启用严格模式,需注意作用域隔离(避免非严格代码被影响)。
实际应用建议
- 新项目建议全局启用严格模式,避免潜在错误。
- 旧项目迁移时,可先针对单个函数启用,逐步修复问题。