严格模式

如何开启严格模式?

在文件或者函数开头使用 “use strict”

严格模式常见的限制

"use strict"
"use strict"
// 1.禁止意外创建全局变量
// 在全局中不使用关键字直接定义变量
message = "hello"
message is not defined

// 2. 不允许函数有相同的参数名称
function foo(x, y, x) {}
// Duplicate parameter name not allowed in this context

// 3.使静默错误(不报错但也没有任何效果)的赋值操作抛出异常
true.name = "abc"
NaN = 123
var obj = {}
Object.defineProperty(obj, "name", {
configurable: false,
writable: false, // 不可写
value: "hillyee"
})
obj.name = "jenny"
// 试图删除不可删除的属性,报错
delete obj.name
// Cannot delete property 'name' of #<Object>

// 4.不允许使用原先的八进制格式
var num = 0o123 // 八进制
var num2 = 0x123 // 十六进制
var num3 = 0b100 // 二进制

严格模式下的this

"use strict"

// 在严格模式下,独立函数调用this默认绑定不是window,而是undefined
function foo() {
console.log(this); // undefined
}
foo()

var obj = {
name: "hill",
foo: foo
}

var bar = obj.foo
bar()

// setTimeout的this
// 内部 fn.apply(this=window)
setTimeout(function() {
console.log(this); // window
}, 1000)