严格模式
程序员文章站
2022-05-01 22:51:56
...
本文根据JavaScript标准教程-阮一峰 整理笔记
严格模式是ES5标准提出来的, 有以下几个目的:
- 明确禁止一些不合理、不严谨的语法,减少
JavaScript
语言的一些怪异行为。 - 增加更多报错的场合,消除代码运行的一些不安全之处,保证代码运行的安全。
- 提高编译器效率,增加运行速度。
- 为未来新版本的
JavaScript
语法做好铺垫。
严格模式下的代码比正常模式下的代码更加严格, 某些代码在正常模式下不会报错, 但是在严格模式下会报错。
我们可以使用'use strict';
方法在代码中启用。 它既可以在整个js
文件中启用, 也可以在函数中启用。
在js文件中启用时, 必须在文件的第一行写上'use strict;'
在函数中启用时, 必须在函数内的第一行写上'use strict;'
显示报错
只读属性不可写
字符串length
属性是只读属性, 在严格模式下设置length
属性会报错, 正常模式下则不会。
删除只读属性或者删除不可配置属性也会报错只设置了取值器的属性不可写
严格模式下,对一个只有取值器(getter
)、没有存值器(setter
)的属性赋值,会报错禁止扩展的对象不可扩展
eval
,arguments
不可用作标识名函数不能有重名的参数
禁止八进制的前缀
0
表示法
增强的安全措施
全局变量必须显示声明
禁止
this
关键字指向全局对象
严格模式下,this
指向的是undefined
function f() {
'use strict';
console.log(this === undefined);
}
f() // true
function f() {
'use strict';
this.a = 1;
};
f();// 报错,this 未定义
禁止使用
fn.calee
,fn.caller
方法禁止使用
arguments.callee
,arguments.caller
禁止删除变量
若删除变量会报错,只有对象的属性,且属性的描述对象的configurable
属性设置为true
,才能被delete
命令删除
'use strict';
var x;
delete x; // 语法错误
var obj = Object.create(null, {
x: {
value: 1,
configurable: true
}
});
delete obj.x; // 删除成功
静态绑定
禁止使用
with
语句eval
作用域
正常模式下eval
作用域取决于它所处的执行环境
严格模式下 ,eval
本省就是一个作用域
(function () {
'use strict';
var x = 2;
console.log(eval('var x = 5; x')) // 5
console.log(x) // 2
})() //由于eval语句内部是一个独立作用域,所以内部的变量x不会泄露到外部
-
arguments
不在追踪参数的变化
function f(a) {
a = 2;
return [a, arguments[0]];
}
f(1); // 正常模式为[2, 2]
function f(a) {
'use strict';
a = 2;
return [a, arguments[0]];
}
f(1); // 严格模式为[2, 1]
向下一个版本的JavaScript过渡
- 非函数代码块不得声明函数
'use strict';
if (true) {
function f1() { } // 语法错误
}
for (var i = 0; i < 5; i++) {
function f2() { } // 语法错误
}
- 保留字
JavaScript设置了一下保留字, 使用保留字作为变量会报错
上一篇: 过滤器(filter)实现用户登录拦截