JS 严格模式

启用

方式1:整个脚本启用严格模式,在顶部执行:"use strict";

'use strict';
var num = 123;

方式2:在指定函数中执行严格模式,在函数体第一行:"use strict";

function func(){
	'use strict';    // 只有该函数使用严格模式
	var num = 123;
}

  • 不支持严格模式的浏览器把 "use strict" 当做字符串语句执行,支持的浏览器将开启严格模式。
  • 支持严格模式的浏览器包括:IE10+、Firefox4+、Safari12+、Opera12+、Chrome 。

规则

[1] 变量:不允许意外创建全局变量;不能对变量调用 delete 操作符。

‘use strict’;
message = 'hello world!';
 
‘use strict’;
var color = 'red';
delete color;

[2] 对象:不能为只读属性赋值;不能为不可配置的属性使用 delete 操作。

‘use strict’;
var person = {
	name:'cook'
};
Object.defineProperty(person,'name',{writable:false});
person.name = 'Nicholas';
 
‘use strict’;
var person = {
	name:'cook'
};
Object.defineProperty(person,'name',{configurable:false});
delete person.name;

[3] 函数:参数必须唯一;修改形参不会反映到 arguments 中;不允许使用 arguments.callee 和 arguments.caller。

‘use strict’;
function(num,num){
	//TODO
}
 
function showValue(value){
	value = 'Foo';
	alert(arguments[0]);
	//非严格模式:'Foo'
	//严格模式:"Hi"
}
showValue('Hi');
 
‘use strict’;
function fn(num){
	return arguments.callee(num);
}
fn(2);
 
‘use strict’;
function outer(){
	inner();
}
function inner(){
	alert(inner.caller());
}
outer();

[4] 不允许 eval() 在包含上下文中创建变量或函数。

‘use strict’;
function fn(){
	eval('var x = 10;');
	alert(x);
}
fn();
 
// 允许以下操作
var result = eval('var x=10,y=11,x+y');
alert(result); // 21

[5] 不允许使用 eval 和 arguments 作为标识符,也不允许读写它们的值。

‘use strict’;
var eval = 10;
var arguments = 20;

[6] 不允许 this 值为 null 或 undefined。

‘use strict’;
var color = ‘red’;
function fn(){
	alert(this.color);
}
fn();

[7] 不允许使用 with 语句。

‘use strict’;
with(location){
	alert(href);
}

[8] 不允许使用八进制字面量。

‘use strict’;
var value = 010;