概述
- 严格模式是从
ES5进入标准的,主要目的是明确禁止一些不合理、不严谨的语法。消除代码运行时的一些不安全之处。
use strict放在脚本文件的第一行,表示整个脚本都会以严格模式运行,如果不在第一行则无效。
<script>
'use strict';
</script>
use strict放在函数第一行,表示整个函数都将以严格模式运行。
function strict() {
'use strict';
return '这是严格模式';
}
严格模式下的错误
'use strict';
'abc'.length = 5;
'use strict';
var obj = Object.defineProperty({}, 'a', {
value: 37,
writable: false
});
obj.a = 123;
'use strict';
var obj = Object.defineProperty({}, 'p', {
value: 1,
configurable: false
});
delete obj.p
'use strict';
var obj = {
get v() { return 1; }
};
obj.v = 2;
'use strict';
var obj = {};
Object.preventExtensions(obj);
obj.v = 1;
'use strict';
var eval = 17;
var arguments = 17;
var obj = { set p(arguments) { } };
try { } catch (arguments) { }
function x(eval) { }
function arguments() { }
var y = function eval() { };
var f = new Function('arguments', "'use strict'; return 17;");
function f(a, a, b) {
'use strict';
return a + b;
}
'use strict';
var n = 0100;
严格模式增加的安全措施
'use strict';
v = 1;
function f() {
x = 123;
}
f();
function f() {
'use strict';
console.log(this === undefined);
}
f()
- 禁止使用 fn.caller、fn.arguments。
function f1() {
'use strict';
console.log(f1.caller);
console.log(f1.arguments);
}
f1();
'use strict';
var f = function () {
return arguments.callee;
};
f();
- 禁止删除变量,如果使用
delete命令删除一个变量,会报错。只有对象属性的属性描述对象的configurable属性设置为true,才能被delete命令删除。
'use strict';
var x;
delete x;
var obj = Object.create(null, {
x: {
value: 1,
configurable: true
}
});
delete obj.x;
function f(a) {
a = 2;
return [a, arguments[0]];
}
f(1);
function f(a) {
'use strict';
a = 2;
console.log(arguments[0]);
arguments[0] = 3;
console.log(a);
}
f(1);