个人技术总结——JavaScript 严格模式

JavaScript的严格模式(“use strict”)是一种特殊的运行模式,它为JavaScript引入了不同的解析和执行模型。启用严格模式可以帮助你写出更安全、更易于管理的代码。以下是严格模式相对于非严格模式的一些主要变化:

1. 变量必须声明

在严格模式下,所有变量必须先声明再使用。如果你尝试使用未声明的变量,JavaScript将抛出错误。

"use strict";
x = 23; // ReferenceError: x is not defined

2. 禁止使用with语句

严格模式禁止使用with语句,因为with会创建自己的作用域,可能导致变量解析的混乱。

"use strict";
with (obj) { // SyntaxError: Strict mode code may not include a with statement
    // ...
}

3. 更严格的赋值错误检查

在严格模式下,对只读属性的赋值、对不可扩展对象的属性赋值、以及对不存在的对象属性赋值会抛出错误。

"use strict";
var obj = {};
Object.defineProperty(obj, "x", { value: 0, writable: false });
obj.x = 3.14; // TypeError: Cannot assign to read only property 'x'

4. 禁止删除不可删除的属性

在严格模式下,尝试删除不可删除的属性会抛出错误。

"use strict";
delete Object.prototype; // TypeError: Cannot delete property 'prototype' of function Object() { [native code] }

5. 禁止重复的参数名称

在严格模式下,函数不能有重名的参数。

"use strict";
function sum(a, a, c) { // SyntaxError: Duplicate parameter name not allowed in this context
    return a + a + c;
}

6. 禁止八进制字面量

严格模式下,不允许使用八进制字面量(以0开头的数字)。

"use strict";
var num = 023; // SyntaxError: Octal literals are not allowed in strict mode.

7. this的值不会被强制转换为对象

在非严格模式下,函数中的this值如果不是对象,会被自动转换为对象。在严格模式下,this会保持原有的值。

"use strict";
function whatIsThis() {
    return this;
}
whatIsThis(); // undefined

8. 禁止arguments对象的某些特性

在严格模式下,arguments对象不再追踪参数的变化,也不能对arguments对象的属性进行赋值。

"use strict";
function modifyArguments() {
    arguments[0] = 99; // 不会改变传入的参数
    return arguments[0];
}
modifyArguments(1); // 99

9. 更严格的evalarguments使用

在严格模式下,evalarguments被当作关键字,不能被用作变量或函数名。

"use strict";
var eval = 17; // SyntaxError: Unexpected eval or arguments in strict mode
var arguments = []; // SyntaxError: Unexpected eval or arguments in strict mode

10. 更安全的错误检查

严格模式会捕获一些常见的编码错误,如对只读属性赋值、删除不可删除的属性、引用不存在的变量等。

11. 禁止this关键字指向全局对象

在严格模式下,如果你在一个函数内部使用this,而该函数未被任何对象调用,this的值不会指向全局对象(在浏览器中是window),而是undefined

"use strict";
function myFunction() {
  return this; // 这里的this是undefined
}

12. 禁止删除声明的变量

在严格模式下,尝试删除一个使用varletconst或函数声明的变量会导致语法错误。

"use strict";
var myVar = "test";
delete myVar; // SyntaxError

13. 更严格的函数调用

在严格模式下,函数的callerarguments属性是不可访问的,尝试访问这些属性会抛出类型错误。

"use strict";
function myFunction() {
  console.log(myFunction.caller); // TypeError
  console.log(myFunction.arguments); // TypeError
}

14. 禁止在非函数代码块中声明函数

在严格模式下,你不能在非函数的代码块(如ifwhilefor等)内声明函数。这样的做法在非严格模式下可能会导致不可预测的结果。

"use strict";
if (true) {
  function f() {} // SyntaxError
}

15. 变量、函数和参数的唯一性

在严格模式下,对象字面量不能有重复的属性名,函数不能有重复的参数名。

"use strict";
var object = { a: 1, a: 2 }; // SyntaxError
function sum(a, b, a) { // SyntaxError
  // ...
}

16. 禁止某些保留字

严格模式增加了一些保留字,这些词不能用作变量名或函数名。这些保留字包括implementsinterfaceletpackageprivateprotectedpublicstaticyield

结论

严格模式通过这些规则增强了错误检查,防止了某些不安全的操作,并使得JavaScript代码更加规范和易于维护。它是现代JavaScript开发中推荐的做法,特别是在ES6及以后的版本中。

如果通过 type="module"script 标签引用 JavaScript 代码时,引入的代码默认开启严格模式

<script src="./src/index.js" type="module"></script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值