JavaScript严格模式(use strict)知识点汇总
一份为编程小白准备的详细指南,用大白话解释严格模式的方方面面
什么是严格模式?
严格模式是JavaScript中的一种特殊模式,它通过更严格的语法检查和行为约束,帮助你写出更安全、更规范的代码。
想象一下,普通模式就像自行车🚲,你可以随意骑行(但也容易摔倒);而严格模式就像带辅助轮的自行车,虽然限制多一些,但能防止你犯常见错误。
启用严格模式很简单,只需要在脚本开头或函数开头添加一句话:“use strict”;
为什么要使用严格模式?
- 防止意外创建全局变量(忘记写var/let/const)
- 消除一些不安全的代码写法
- 禁止使用一些未来可能成为保留字的关键字
- 使JavaScript引擎可以更好地优化代码
- 帮助开发者发现代码中的潜在问题
📌 重要提示:
严格模式不是所有浏览器的默认模式,必须明确声明才能启用。
严格模式可以应用于整个脚本,也可以只应用于单个函数。
严格模式的主要变化和规则
在普通模式中,如果你忘记声明变量(不使用var/let/const),JavaScript会悄悄创建一个全局变量。
在严格模式中,这种做法会导致错误:
myVar = 10; // 报错:myVar is not defined
这样能防止你意外污染全局命名空间。
在普通模式中,尝试删除变量、函数或不可删除的属性会静默失败(不会报错)。
在严格模式中,这些操作会抛出错误:
var x = 10;
delete x; // 报错:Cannot delete variable
delete Object.prototype; // 报错:Cannot delete property
在普通模式中,函数允许有重复的形参名(最后一个有效)。
在严格模式中,这会抛出语法错误:
function sum(a, a, c) { // 报错:Duplicate parameter name
return a + a + c;
}
这样可以避免参数名冲突导致的bug。
with
语句会延长作用域链,但会导致性能下降和代码不可预测。
严格模式完全禁止使用with
语句:
with (Math) { // 报错:Strict mode code may not include a with statement
x = cos(3);
}
这样能提高编译器优化的可能性。
在严格模式中,eval
创建的变量只在eval代码块内部有效:
eval(“var x = 10;”);
console.log(x); // 报错:x is not defined
这样可以防止eval污染外部作用域。
另外,不能使用eval
作为变量名:
var eval = 10; // 报错:Unexpected eval or arguments in strict mode
在普通函数中,普通模式下this
指向全局对象(浏览器中是window)。
在严格模式中,this
的值是undefined
:
function showThis() {
console.log(this); // 输出:undefined
}
showThis();
构造函数调用时,如果忘记写new
关键字,普通模式会创建全局变量,但严格模式会报错:
function Person(name) {
this.name = name;
}
// 忘记new关键字:
var p = Person(“John”); // 报错:Cannot set property ‘name’ of undefined
在普通模式中,数字以0开头表示八进制(如010等于十进制的8)。
严格模式禁止这种写法:
var num = 010; // 报错:Octal literals are not allowed
可以使用ES6的0o前缀表示八进制:
在普通模式中,给只读属性赋值会静默失败。
在严格模式中,这会抛出错误:
var obj = {};
Object.defineProperty(obj, “x”, { value: 42, writable: false });
obj.x = 9; // 报错:Cannot assign to read only property
严格模式限制使用一些保留字作为变量名或函数名:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
var private = 10; // 报错:Unexpected strict mode reserved word
📝 严格模式使用总结
- 全局启用: 在脚本文件的最顶部添加
"use strict";
- 局部启用: 在函数体的最顶部添加
"use strict";
- 模块自动启用: ES6模块系统默认使用严格模式
- 向下兼容: 严格模式在旧版浏览器中会被忽略
- 迁移建议: 逐步启用严格模式,先用于新代码
- 最佳实践: 现代JavaScript开发推荐始终使用严格模式
什么时候应该使用严格模式?
强烈建议在所有新项目中使用严格模式。它能帮你避免很多常见错误,使代码更安全、更易维护。