1、严格模式下不能应用 with 语法
1、在未应用严格模式下,上面的代码是能够执行的
const obj = {name: 'peter'}
function foo(){with(obj) {console.log(name)
}
}
foo()//peter
2、而当咱们开启了严格模式后,将会间接禁用 with 语法
2、严格模式下,在 function 中应用 this 会有变动
1、未应用严格模式下的 function 中的 this 指向
function foo(){console.log(this)// 指向 window
}
2、而当咱们开启严格模式后
function foo(){console.log(this)//undefined
}
3、严格模式下,会避免意外的申明全局变量
1、未应用严格模式时,以下语法是被容许,变量会被定义为全局变量
function foo(){name = "peter"}
console.log(name)//peter
2、这个变量命名在严格模式下是不被运行,执行时将会报错
4、严格模式下,将不会运行函数有反复的参数名
1、未应用严格模式,咱们能够给一个函数命名反复的参数名
function foo(a,b,a) {console.log(a,b,a)
}
foo(1,2,3)//1,2,3
2、而当开启了严格模式,这种书写形式将会报错:SyntaxError: Duplicate parameter name not allowed in this context
5、严格模式下,之前的八进制书写将会报错
1、之前的八进制书写格局
const num = 0123
console.log(num)//83
2、而在严格模式下,这种书写是不被容许:SyntaxError: Octal literals are not allowed in strict mode.
然而咱们能够改成以下的格局
"use strict"
const num = 0o123
console.log(num)//83
6、严格模式下,将会引起隐默失败的赋值操作抛出谬误
1、未应用严格模式时,上面对 obj 对象中的 name 进行批改尽管是失败的,然而不会抛出谬误
const obj = {name: 'peter'}
Object.defineProperty(obj, 'name', {writable: false})
obj.name = 'lisa'
2、然而当咱们开启了严格模式的状况下,对 name 的批改则会抛出谬误:TypeError: Cannot assign to read only property ‘name’ of object ‘#<Object>’
"use strict"
const obj = {name: 'peter'}
Object.defineProperty(obj, 'name', {writable: false})
obj.name = 'lisa'
7、严格模式下,eval 将不会为下层援用变量
1、未应用严格模式
const jsStr = 'var message ="hello world"; console.log(message)'
eval(jsStr)//hello world
console.log(message)//hello world
2、应用严格模式后:ReferenceError: message is not defined
"use strict"
const jsStr = 'var message ="hello world"; console.log(message)'
eval(jsStr)
console.log(message)
8、严格模式下,删除不可删除的属性将会报错
TypeError: Cannot delete property ‘name’ of #<Object>
"use strict"
const obj = {name: 'peter'}
Object.defineProperty(obj, 'name', {writable: false,configurable: false})
delete obj.name