关于javascript:JavaScript使用严格模式的一些变化以及影响

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

9、严格模式下将不能应用js将来将会应用的关键字(保留字)

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理