您现在的位置是:网站首页 > 严格模式文章详情
严格模式
陈川
【
JavaScript
】
34450人已围观
2606字
JavaScript的严格模式是一种限制性更强的代码执行环境,它通过抛出更多错误和禁用某些不安全特性来提高代码质量。严格模式可以应用于整个脚本或单个函数,帮助开发者避免常见的陷阱。
严格模式的启用
在脚本或函数开头添加特定指令即可启用严格模式。全局使用时需放在所有其他语句之前:
// 全局严格模式
'use strict';
function doSomething() {
// 函数代码
}
函数内部使用时:
function strictFunction() {
'use strict';
// 函数代码
}
变量声明要求
严格模式要求所有变量必须显式声明:
'use strict';
x = 10; // ReferenceError: x is not defined
正确的做法是:
'use strict';
let x = 10; // 正确
禁止删除不可删除的属性
尝试删除变量、函数或不可配置的属性会抛出错误:
'use strict';
delete Object.prototype; // TypeError
let y = 15;
delete y; // SyntaxError
函数参数限制
严格模式禁止重复的参数名:
'use strict';
function sum(a, a, c) { // SyntaxError
return a + a + c;
}
this 绑定变化
非严格模式下,全局函数的this指向window,严格模式下为undefined:
'use strict';
function showThis() {
console.log(this); // undefined
}
showThis();
禁止八进制字面量
严格模式移除了八进制数字表示法:
'use strict';
let octal = 010; // SyntaxError
eval 限制
严格模式为eval创建独立作用域:
'use strict';
eval('var x = 2');
console.log(x); // ReferenceError
只读属性赋值
尝试修改只读属性会抛出错误:
'use strict';
let obj = {};
Object.defineProperty(obj, 'x', { value: 42, writable: false });
obj.x = 9; // TypeError
arguments 对象限制
严格模式下arguments对象与参数解耦:
'use strict';
function fn(a) {
a = 2;
return [a, arguments[0]];
}
console.log(fn(1)); // [2, 1]
禁止使用with语句
严格模式禁用with语句:
'use strict';
with (Math) { // SyntaxError
x = cos(3);
}
新增保留字
严格模式将一些未来可能使用的关键字列为保留字:
'use strict';
let implements = 10; // SyntaxError
更安全的eval和arguments
严格模式限制对eval和arguments的操作:
'use strict';
eval = 17; // SyntaxError
arguments++; // SyntaxError
函数块级声明
ES5严格模式禁止在块中声明函数:
'use strict';
if (true) {
function f() {} // SyntaxError in ES5 strict
}
显式报错的常见操作
严格模式将静默错误转为显式报错:
'use strict';
NaN = 1; // TypeError
undefined = 5; // TypeError
性能优化优势
严格模式代码通常运行更快,因为:
- 变量引用无需查询原型链
- 编译器可以更好地优化代码结构
- 减少了运行时动态检查
模块和类中的严格模式
ES6模块和类自动启用严格模式:
class StrictClass {
constructor() {
x = 1; // ReferenceError
}
}
迁移到严格模式的注意事项
- 逐步迁移,先测试单个文件
- 注意第三方库兼容性
- 使用try-catch处理可能抛出的错误
- 检查所有变量声明
浏览器兼容性处理
可以通过IIFE实现兼容:
(function() {
'use strict';
// 严格模式代码
})();
调试技巧
严格模式下的错误信息通常更具体:
- 注意错误类型变化
- 堆栈跟踪更准确
- 使用开发者工具设置断点
常见误区和解决方案
-
忘记在文件开头添加'use strict'
- 解决方案:使用编辑器片段或模板
-
合并严格和非严格脚本
- 解决方案:统一模式或使用IIFE隔离
-
依赖非严格特性
- 解决方案:重写相关代码逻辑
上一篇: 错误处理机制
下一篇: ECharts简介与发展历史