js 严格模式
JavaScript 严格模式是 ECMAScript 5 引入的一种限制 JavaScript 语法的方式,其目的是使 JavaScript 更安全,减少一些不易察觉的错误,并搭配更多警告和更严格的错误处理。以下是一些使用严格模式的好处:
- 消除 JavaScript 语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的 JavaScript 做好铺垫。
如何开启严格模式
在 JavaScript 中启用严格模式非常简单,只需在代码顶部添加以下代码:
'use strict';
当浏览器解析到该声明时,便会启用严格模式。严格模式可以应用于整个脚本或个别函数。在整个脚本中使用时,在<script>
标签或独立 JavaScript 文件头部加上该声明。在单个函数中使用时,也可以加在函数体顶部。
值得注意的是,如果将严格模式用在函数中,在函数内声明会覆盖在全局作用域声明。
严格模式的变化
1. 变量必须声明后再使用
在严格模式下,使用未声明的变量将会抛出错误。
'use strict';
x = 10; // Uncaught ReferenceError: x is not defined
在非严格模式下,上面的代码会在全局作用域下创建一个全局变量 x
。
2. 禁止删除变量
严格模式下,禁止删除变量。
'use strict';
var y = 20;
delete y; // Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
3. 禁止使用未声明的变量
严格模式下,禁止使用未声明的变量。
'use strict';
z = 30; // Uncaught ReferenceError: z is not defined
4. 函数必须声明在顶层作用域
严格模式下,在函数内部不允许声明在顶层作用域的函数。
'use strict';
if (true) {
function foo() {
console.log('foo');
}
}
在非严格模式下,函数 foo
的定义会被提升到全局作用域。
5. 函数参数不能重复
在严格模式下,不允许函数的参数有重复的名字。
'use strict';
function bar(x, x) {
console.log(x);
}
6. 避免使用 this
指向全局对象
在严格模式下,全局对象无法用于 this
。
'use strict';
function printThis() {
console.log(this);
}
printThis(); // undefined
7. 保留字
严格模式新增了一些保留字,不能用作变量名,比如 implements
、interface
、package
、private
、protected
、public
、static
、yield
。
严格模式的运行结果
在上述示例中,我们已经展示了开启严格模式后的代码运行结果。下面我们再举一个完整的示例,演示在严格模式下,代码的运行结果和非严格模式下的不同:
// 非严格模式
function normalMode() {
normalVariable = 100;
console.log(normalVariable); // 100
}
normalMode();
// 严格模式
function strictMode() {
'use strict';
strictVariable = 200; // Uncaught ReferenceError: strictVariable is not defined
console.log(strictVariable);
}
strictMode();
上面的代码在非严格模式下,可以正常运行并输出 100
,而在严格模式下,会抛出一个引用错误,因为 strictVariable
未定义。
结语
通过本文的介绍,相信您已经了解了 JavaScript 严格模式的基本概念、使用方法以及效果。在开发中,为了写出更加规范、严谨和安全的 JavaScript 代码,推荐在适当的场景下使用严格模式,尽可能避免一些潜在的错误。