JavaScript的严格模式有哪些容易被忽略的限制?

高分请教下,JavaScript的严格模式有哪些容易被忽略的限制?
最新回答
看不见的坚强

2026-10-22 18:52:43

JavaScript严格模式中容易被忽略的限制包括无法隐式创建全局变量、禁止删除不可配置的属性和变量、函数参数名必须唯一、arguments与参数解绑、禁用with语句、函数内this为undefined。具体说明如下:

  • 无法隐式创建全局变量非严格模式下,未声明的变量赋值会隐式创建全局变量;严格模式会直接抛出ReferenceError。例如:

    "use strict";function example() { user = "John"; // 报错:user is not defined}example();

    需显式使用var、let或const声明变量,避免污染全局作用域。

  • 禁止删除不可配置的属性和变量声明严格模式禁止用delete删除变量、函数名或不可配置的属性,否则抛出语法错误。例如:

    "use strict";var myVar = 1;delete myVar; // 报错:Cannot delete 'myVar'delete Object.prototype; // 报错:Cannot delete property 'prototype'

    delete仅适用于对象的可配置属性(如自定义对象属性)。

  • 函数参数名必须唯一严格模式要求函数参数名唯一,重复参数会直接报错。例如:

    "use strict";function test(a, a, b) { // 报错:Duplicate parameter name return a + b;}

    非严格模式下,重复参数会被后续值覆盖,严格模式强制避免歧义。

  • arguments对象与参数解绑非严格模式中,修改命名参数会同步更新arguments对象,反之亦然;严格模式切断这种绑定。例如:

    "use strict";function f(a) { a = 10; console.log(arguments[0]); // 输出调用时的值(如5),而非10}f(5);

    此变化使参数和arguments行为更独立,但需注意依赖旧行为的代码迁移。

  • 禁用with语句严格模式完全禁用with语句,因其会动态改变作用域链,导致变量查找不可预测,干扰编译器优化。例如:

    "use strict";with ({x: 10}) { // 报错:Strict mode code may not include a with statement console.log(x);}

    替代方案是显式引用对象属性(如obj.x),提升代码可读性。

  • 函数内this不再指向全局对象非严格模式中,未绑定的函数this默认指向全局对象(如浏览器中的window);严格模式下this为undefined。例如:

    "use strict";function showThis() { console.log(this); // 输出undefined}showThis();

    构造函数若未用new调用,this也不会指向全局对象,减少意外修改全局状态的风险。

总结:严格模式通过上述限制强制开发者遵循更严谨的编码规范,虽增加初期调试成本,但能显著提升代码安全性、可维护性,并减少潜在错误。建议始终开启严格模式(在文件或函数顶部添加"use strict";),以利用其长期收益。