1、含义
ECMAScript5引入严格模式("strict mode")。通过严格模式,在函数内部选择进行较为严格的全局或局部的错误条件检测,使用严格模式的好处是可以提早知道代码中的存在的错。
进入严格模式的指令"use strict;"
这个语法从ECMAScript 3 开始支持。向后兼容不支持严格模式的浏览器,他们就当遇到了一个普通字符串,编译时忽略。
2、脚本文件或函数中使用
将"use strict";放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行。
<script>
"use strict";
//进入严格模式
</script>
<script>
//正常模式
</script>
函数中的严格模式,指令放在函数内第一行
function foo(){
"use strict";
//严格模式
}
function boo(){
//正常模式
}
特别注意: 建议只在特定的作用域中使用严格模式。放在全局作用域中(函数外部),页面的其他脚本也都处于严格模式下,不利于文件合并。
一种变通的方法
(function (){
"use strict";
  // some code here
})();
3、变量
(1)严格模式下,变量必须先声明再使用,不允许意外创建的全局变量
"use strict";
a = 'aa'; //报错,a未声明
for(i = 0; i < 10; i++){//报错,i未定义
}
(2)不能调用delete操作符删除一个变量名(而不是属性名)
"use strict";
var a = 'aa';
delete a;//报错
在非严格模式中,这样的代码只会静默失败,这样可能会导致用户误以为删除操作成功了
var a = 'aa';
delete a;
console.log(a);//'aa'
(3)不允许变量名或参数名使用这些词implements, interface, let, package, private, protected, public, static, yield
不允许使用eval或arguments作为变量名或函数名
function package(protected){ // 报错!
"use strict";
var implements; // 报错!
interface: // 报错!
while (true){
break interface; // 报错!
}
function private() { } // 报错!
}
function fun(static) { 'use strict'; } // 报错!
4、对象
(1)不允许为只读属性赋值
(2)不允许对象字面量中使用两个相同的属性名
"use strict"
var person = { //报错
name : "Tom"
name : "Cat"
}
非严格模式,person.name会取最后一个值
(3)为不可配置的属性使用delete操作符
(4)为不可扩展的对象添加属性
5、函数
(1)不允许函数形参中使用两个相同的参数名
"use strict"
function sum(num, num) {} //报错
非严格模式,函数内部实际访问的是第二个参数,要访问第一个参数必须通过arguments对象
"use strict"
function showValue(value) {
value = "Foo"
alert(value) // Foo
alert(arguments[0]) // 严格模式 hi
// 非严格模式 Foo
}
showValue("hi")
(2) 不允许使用arguments.callee, arguments.caller, anyFunction.caller以及anyFunction.arguments
(3)只能在脚本的顶级和在函数内部申明函数,不允许在语句块中使用函数声明会,如for、if
"use strict";
if (true){
function f() { } // 报错! syntax error
f();
}
for (var i = 0; i < 5; i++){
function f2() { } // 报错! syntax error
f2();
}
function baz(){ //ok
function eit() { } //ok
}
6、this
严格模式下抑制this
(function(){ return this; })()
Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
(function(){ 'use strict'; return this; })()
undefined
7、其他
(1)数字前面不允许0
"use strict";
var sum = 015 + // 报错! syntax error
197 +
142;
var n = 023;//报错!Octal literals are not allowed in strict mode
var s = "\047";//报错!Octal literals are not allowed in strict mode
(2)去掉with语句
参考链接