📜  JavaScript |严格模式(1)

📅  最后修改于: 2023-12-03 14:42:28.716000             🧑  作者: Mango

JavaScript | 严格模式

简介

严格模式(Strict mode)是 ECMAScript 5 引入的一种限制JavaScript语言的变化,并提供更多错误检查机制的语法规范。它是 JavaScript 的一个子集, 主要为了让 JavaScript 更加安全,更加严谨。

使用严格模式,需要在代码开头添加 'use strict'"use strict" 声明,即可开启严格模式。

'use strict';

function myFunction() {
  // 严格模式下,不允许使用未声明的变量
  x = 3; // ReferenceError: x is not defined
}
特性

在严格模式下,JavaScript 会进行以下的限制:

  1. 变量必须先声明,再使用。
'use strict';

function myFunction() {
  // 严格模式下,不允许使用未声明的变量
  x = 3; // ReferenceError: x is not defined
}
  1. 禁止使用 with 语句。
'use strict';

with (Math) { // SyntaxError: Strict mode code may not include a with statement
  console.log(cos(90));
}
  1. 禁止删除变量,函数或函数的参数。
'use strict';

let x = 1;
delete x; // SyntaxError: Delete of unqualified identifier in strict mode.

function myFunction(a) {
  delete a; // SyntaxError: Delete of an unqualified identifier in strict mode.
}
  1. 对象字面量中属性名不能重复,函数参数名不能重复。
'use strict';

// 严格模式下,对象字面量中属性名不能重复
var obj = {
  a: 1,
  b: 2,
  a: 3 // SyntaxError: Duplicate data property in object literal not allowed in strict mode
};

// 严格模式下,函数参数名不能重复
function myFunction(a, b, a) { // SyntaxError: Duplicate parameter name not allowed in this context
  console.log(a + b + a);
}
  1. 函数必须严格符合函数定义,不能使用 arguments.calleearguments.caller
'use strict';

// 严格模式下,不能使用arguments.callee 或 arguments.caller
(function() {
  // 在严格模式下,将会抛出 TypeError
  arguments.callee(); 
})();
  1. 对于 eval 顶层作用域被限制到当前作用域,并且不会从当前作用域引入变量。
'use strict';

// 严格模式下,eval 的作用域被限制到当前作用域,并不能引入上层作用域中的变量。
var x = 10;
eval('var x = 20');
console.log(x); // 10
  1. 保留字被保留,不能做变量名或者参数名。
'use strict';

function myFunction(let) { // SyntaxError: Unexpected strict mode reserved word
  console.log(let);
}
建议

严格模式虽然是一种好的语法规范,但是并非必须使用的。在现代浏览器中,默认都是开启严格模式。但是,如果你需要兼容低版本的浏览器,或者你正在使用一些遗留代码,那么就需要注意以下问题:

  • 如果将严格模式代码与非严格模式代码混合,可能会引起一些问题。建议在整个文件中都使用严格模式。
  • 如果你想使用一些 ECMA5 标准中新的特性,那么必须开启严格模式。
结语

严格模式是 ECMAScript 5 增加的一种规范,主要为了增强代码的安全和严谨性。严格模式对 JavaScript 进行了限制和改进,可以帮助程序员更好的编写 JavaScript 代码。