ECMAScript严格模式简介

写在前面

大家都知道使用"use strict"表示使用ECMAScript进行严格模式,使用"use strict"有两种方式

  • 在文件头部写上它(使得整个脚本都使用严格模式)
  • 在函数顶部写上它(只在函数内打开严格模式)

对于严格模式和非严格模式下,到底有哪些不同,下面我将一一道来。

变量

严格模式下 非严格模式下
不允许意外创建全局变量 允许省去var来创建全局变量
不能对变量调用delete操作符(也就是说使用delete来删除变量时操作会直接报错) 允许使用delete但操作失败(也就是说使用delete来删除变量时操作时不会直接报错)

对象

严格模式下 非严格模式下
不允许为只读属性赋值 允许为只读属性赋值
不允许对不可配置(nonconfiguratable)属性使用delete操作符 允许对不可配置(nonconfiguratable)属性使用delete操作符
不允许为不可扩展(nonextensible)的对象添加属性 允许为不可扩展(nonextensible)的对象添加属性
使用对象字面量时,属性名必须唯一 使用对象字面量时,属性名可以重复

函数

严格模式下 非严格模式下
函数参数不能重复 函数参数可以重复,如果重复的话,参数最终的取值为第二个,如果要取得第一个的话则得使用arguments
函数参数和arguments是完全独立的 修改命名参数的值同时会反映到arguments对象当中
淘汰arguments.callee和arguments.caller arguments.callee代表引用函数本身、arguments.caller调用当前引用函数的函数

不允许使用inplements、interface、let、package、private、protected、public、static、yield作为函数名

(因为这些是js当中的保留字并且已经在新的语法当中使用起来了)

允许使用inplements、interface、let、package、private、protected、public、static、yield作为函数名

eval

在严格模式下在eval中不再创建变量或函数

可以在eval中声明变量和函数,但这些变量或函数只能被求值的特殊作用域中有效,随后就被销毁了。

eval和arguments

严格模式下禁止使用eval和arguments作为标识符,也不允许读写它们的值

非严格模式下可以重写eval,也可以给arguments赋值

抑制this

在非严格模式下使用apply和call方法时,null或undefined值被转换为全局对象

严格模式下,传进去的是什么,this就是什么

with

严格模式下已经废弃了with,但是非严格模式下可以使用with

parseInt的八进制

严格模式下去掉了javaScript的八进制字符量

原文地址:https://www.cnblogs.com/liyunhua/p/4495547.html