JavaScript被设计为能使新人开发者更易于上手, 所以有时候会给本来错误操作赋予新的不报错误的语义(non-error semantics). 有时候这可以解决当前的问题, 但有时候却会给以后留下更大的问题. 严格模式则把这些失误当成错误, 以便可以发现并立即将其改正.
开启严格模式
在需要开启严格模式的函数或者文本中传入特定语句'use strict'
(或者"use strict"
)即可开启严格模式
- 为整个脚本开启
'use strict' var strict='I am a strict mode';
- 为函数开启
function strict(){ 'use strict' console.log('I am a strict mode function'); }
严格模式的变化
一、无法意外创建全局变量,利用抛出错误代替,普通JavaScript中会创建并继续执行:
'use strict'
avaliable=3
console.log(avalible)
运行上述代码,控制台抛出错误
Uncaught ReferenceError: avaliable is not defined
普通模式则创建,并打印
二、引起静默失败(不报错也不产生效果的错误),在普通模式下会不处理,但是在严格模式下会抛出错误,例如 undefined 是全局中的一个变量,在普通模式下给undefined赋值,不会产生错误,也不会对改变undefined的值
//'use strict'
undefined=3
console.log(undefined)//控制台打印undefined
使用严格模式,控制台抛出错误
Uncaught TypeError: Cannot assign to read only property ‘undefined’ of object ‘#’
三、严格模式下试图删除不可删除属性时抛出错误
在JavaScript 中,delete 用于删除对象中的某个属性值,其返回值均为 True 当删除属性为不可删除属性时,非严格模式返回false ,严格模式抛出错误
'use strict'//不使用不报错
delete Object.prototype;
//抛出错误
//test.html:14 Uncaught TypeError: Cannot delete property 'prototype' of function Object() //{ [native code] }
四、要求函数参数名唯一,在普通模式,函数参数名存在两个时,后边个会覆盖前边个变量,但是严格模式下被认为为意料之外的情况(例如写错)抛出错误
// 'use strict'
function sum(a,a,b){
console.log(a+a+b)
}
sum(1,2,3)//非严格模式打印7 2+2+3
使用严格模式,抛出错误
Uncaught SyntaxError: Duplicate parameter name not allowed in this context
浏览器的严格模式
主流浏览器都支持严格模式,但是仍有一部分浏览器不支持,严格模式改变了语义,在使用时需注意兼容性问题。