起源

// "use strict"var message = "Hello World"console.log(message)// 严格模式下报错// true.foo = "abc"// name="abc"

开启

(JS文件中,写在最上面一行)
(某个函数中开启)
另外,一般打包工具(webpack、vite、vuecli等等)都会打包好后开启严格模式
严格模式限制

"use strict"// ====================== 1. 禁止意外创建全局变量 ======================message = "Hello World" // Xconsole.log(message)function foo() {age = 20 // X,创建了全局的变量}foo()console.log(age) // X// ====================== 2.不允许函数有相同的参数名称 ======================function foo(x, y, x) { // Xconsole.log(x, y, x)}foo(10, 20, 30)// ====================== 3.静默错误 ======================true.name = "abc" // XNaN = 123 // Xvar obj = {}Object.defineProperty(obj, "name", {configurable: false, // 是否可以配置,比如是否可以删除writable: false, // 是否能修改value: "why"})console.log(obj.name)obj.name = "kobe"// Xdelete obj.name // X// ====================== 4.不允许使用原先的八进制格式 0123 ======================var num0 = 0123 // 八进制,不可以var num = 0o123 // 八进制,可以var num2 = 0x123 // 十六进制,可以var num3 = 0b100 // 二进制,可以console.log(num, num2, num3)// ====================== 5.with语句不允许使用 ======================var obj1 = {message:"abc"}with(obj1) { // 给里面的代码一个作用域objconsole.log(message)}// ====================== 6.eval函数不会向上引用变量了 ======================var jsString = '"use strict"; var message = "Hello World"; console.log(message);'eval(jsString)console.log(message) // X// ====================== 7.this绑定不会默认转成对象 ======================// 在严格模式下, 自执行函数(默认绑定)会指向undefined// 之前编写的代码中, 自执行函数我们是没有使用过this直接去引用windowfunction foo() {console.log(this)}var obj = {name: "why",foo: foo}foo() // undefinedobj.foo() // objvar bar = obj.foobar() // undefined// setTimeout的this// fn.apply(this = window)setTimeout(function() {console.log(this) // window}, 1000);
setTimeout的this是特殊的,源码可能是如下实现的,this绑定的都是一个window对象:
