什么是严格模式和普通模式
通过在整个js文件或者function前部添加“use strict”,是js解析器在执行js或者函数的时候,使用比普通模式下更加严格的语法,这就叫做严格模式。
为什么要区分这两种模式,区分的好处
严格模式是一种将更好的错误检查引入代码中的方法,使用严格模式,无法使用隐式声明的变量,将赋值给只读属性或将属性添加到不可扩展的对象等。
使用严格模式的好处:
- 消除一些JavaScript语法中的一些不合理,不严谨之处;减少一些怪异行为。
- 消除代码运行的一些不安全之处,保证代码运行的安全
- 提高编译器效率,增加运行速度。
- 为未来新版本的JavaScript做好铺垫。
严格模式被禁用的行为
- 变量在没有声明的情况下不能直接赋值,否则会报错。var的变量提升的效果还在。
- 函数中的this不再指向window,而是指向undefined
- 函数中的arguments对象保存的传入的参数的值的静态副本,在非严格模式中,arguments里的数组元素和函数参数都是指向同一个值的引用。
- 严格模式里with不能使用。
- 试图删除一个对象的不可配置的属性将抛出一个类型错误。
- delete 运算符后跟非法的标识符(比如变量、函数、函数参数)时,将会抛出一个语法错误异常。
- 在一个对象中直接定义两个或者多个同名属性将会产生一个语法错误,非严格模式不会报错,会覆盖之前的属性。
- 函数中存在两个或者多个同名的参数将产生一个语法错误,非严格模式不会报错。
- 严格模式中不允许使用八进制整数直接量
- eval和arguments当作关键字,他们的值是不能更改的。不能给这些标识符赋值,也不能把他们声明为变量、用作函数名、用作函数参数或用作catch块的标识符。
- 限制了对调用栈的检测能力,在严格模式中的函数中,arguments.caller和arguments.callee都会抛出一个类型错误异常。严格模式的函数同样具有caller和arguments属性,当访问者连两个个属性将抛出类型错误异常。
- eval函数执行的代码不能在底调用程序所在的上下文中声明变量或定义函数,它的作用域是在运行的时候是一个新的作用域。而且这个作用域在执行完成时返回值时就会被弃用。