JavaScript 严格模式(use strict)


JavaScript 严格模式(use strict)是在 ECMAScript 5 规范中新增的一种使用模式,它最初是引入在 JavaScript 中用于解决一些不易察觉的错误,提高了代码的严谨性、规范性和效率。下面是一份详细的介绍。

理解严格模式

严格模式可以用于整个脚本文件或单个函数体中。使用严格模式会使 JavaScript 的执行效率更加高效,因为浏览器或者环境遇到语法错误或者不安全操作时,都会引发错误并终止执行。更加高效的执行带来的是更加显著的性能优势。

使用严格模式

要使用严格模式,需要在脚本文件或函数体中添加"use strict";。如果在全局环境中调用"use strict";,则该代码文件的所有部分都将进入严格模式,而如果在函数体内部调用 use strict,则该函数内部进入严格模式。值得注意的是,在静态代码分析工具的帮助下,可以快速查找并理解代码中使用或未使用严格模式的区别。

严格模式的语法提示包括以下类型:

  1. 全局变量和函数必须不含有未声明的变量。
  2. 函数参数不允许有同名属性。
  3. 不能对不可扩展对象(如标准的 Object.preventExtensions 方法)添加属性。
  4. with 语句不允许调用函数(即函数调用的对象不为 window)。
  5. eval 函数不能修改来自外层作用域的变量。

语法提示

未声明的变量

在严格模式下必须先声明一个变量再使用它,否则会抛出 SyntaxError 错误。例如:

"use strict";
x = 3.14; // 抛出错误提示 x 未定义

同名属性

在严格模式下不能给函数的两个参数命名相同的值。例如:

"use strict";
function foo(val1, val1, val3){} // 抛出错误提示 val1 重复定义。

不可扩展的对象

使用 Object.preventExtensions() 方法创建的对象不允许添加新属性。在严格模式下,如果试图向不可扩展的对象添加新属性,则会抛出一个 TypeError 错误。例如:

"use strict";
var obj = {x: 10};
Object.preventExtensions(obj);
obj.y = 20; // 抛出 TypeError 错误。

with 语句

在 JavaScript 中,with 语句可以将代码局部作用域与某个对象关联起来以便使用它的属性和方法。在严格模式下,不允许使用 with 语句调用函数,否则会引发错误。例如:

"use strict";
with(window) {
    alert(location.href); // 抛出错误提示 with 语句中不能有函数调用,此处触发错误
}

eval 函数

在严格模式下,eval() 函数不允许修改它外层作用域中的变量。例如:

"use strict";
var x = 10;
function foo() {
    eval("x = 20");
    alert(x); // 在严格模式下,这里会弹出错误提示 x 没有被定义
}

结论

在编写 JavaScript 代码时,使用严格模式很好地避免了一些经典的错误,因此能够大大提高代码质量,从而更好地实现代码可读性、维护性、可靠性和稳定性。使用严格模式的优势包括:更严谨、提高代码效能、更好的禁止争议、防止全局变量无意中修改对象等。虽然严格模式不是万能的,但在逐渐承担用于语言开发和编写更安全,更可靠和更高效的代码方面起到了巨大作用。