面试之严格模式

64 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

这个小文章是一个关于严格模式的详细探究,分别是鉴别了严格模式中变量、对象和函数在严格模式的不同。其中严格模式中函数的变化较大。希望大家可以详细的看一看。

喜欢(❤ ω ❤)就点个赞吧~~

变量

  1. 变量使用之前要声明
  2. 变量不能执行delet操作 这是因为在严格模式中变量的属性描述中configurable:false,在非严格模式configurable:true。
  3. 静默失败--->报错error

对象

  1. 对象中的属性描述中只有enumerable不会静默失败报错。
  2. 在修改了configurable和writable之后就会在严格模式中使用delete和重新赋值都会出现报错
  3. 静默失败--->报错error
“use strict”
var obj={
name:'你好'
}
Object.getOwnPropertyDescriptor(obj, 'name')
//当改变obj中name的属性在严格模式就会出现报错
Object.defineProperty(obj, 'name', {
configurable:false
writable:false
})

函数

  1. 当函数的形参参数给了默认值之后就会默认开启严格模式
  2. 参数是唯一的,函数中不能出现两个相同的形参
  3. 实参和形参是没有映射关系的
  4. 不能使用arguments.callee 和argument.caller
  5. 不允许使用eval()和with(),存在着重大隐患,在严格模式中被禁止了
  6. 不允许出现八进制的数,由于八进制前边是加一个0,使得会出现歧义,可能是补位
  7. 不允许eval 和argument字眼的变量名称
  8. 函数的默认this指向undifined,函数的this,

这个案例说明了两个东西一个是实参和形参之间没有了关系,另一个是当 形参有默认的值时就会自动开启严格模式。

function test(a=30){
arguments[0] = 20
//a=20
console.log(a)
}
test(10) //10

在这个案例中说明不能使用argumengts的callee和caller方法。

“use strict”
function test(){
console.log(arguments.callee === test)
}
//报错
function outer(){
inner()
}
function inner(){
console.log(inner.caller === outer)
}
outer()
//在非严格模式:true  严格模式报错

进制表示

  1. 二进制开头0b
  2. 八进制开头0
  3. 十六进制开头0x
var value = ob10101010
var value= 010101010
var value = 0x10101010