起源
// "use strict"
var message = "Hello World"
console.log(message)
// 严格模式下报错
// true.foo = "abc"
// name="abc"
开启
(JS文件中,写在最上面一行)
(某个函数中开启)
另外,一般打包工具(webpack、vite、vuecli等等)都会打包好后开启严格模式
严格模式限制
"use strict"
// ====================== 1. 禁止意外创建全局变量 ======================
message = "Hello World" // X
console.log(message)
function foo() {
age = 20 // X,创建了全局的变量
}
foo()
console.log(age) // X
// ====================== 2.不允许函数有相同的参数名称 ======================
function foo(x, y, x) { // X
console.log(x, y, x)
}
foo(10, 20, 30)
// ====================== 3.静默错误 ======================
true.name = "abc" // X
NaN = 123 // X
var obj = {}
Object.defineProperty(obj, "name", {
configurable: false, // 是否可以配置,比如是否可以删除
writable: false, // 是否能修改
value: "why"
})
console.log(obj.name)
obj.name = "kobe"// X
delete 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) { // 给里面的代码一个作用域obj
console.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直接去引用window
function foo() {
console.log(this)
}
var obj = {
name: "why",
foo: foo
}
foo() // undefined
obj.foo() // obj
var bar = obj.foo
bar() // undefined
// setTimeout的this
// fn.apply(this = window)
setTimeout(function() {
console.log(this) // window
}, 1000);
setTimeout的this是特殊的,源码可能是如下实现的,this绑定的都是一个window对象: