直击Javascript的严格模式(“use strict”)

直击Javascript的严格模式(“use strict”)
最新回答
我的眼泪因为你悲伤。

2021-07-22 06:18:40

JavaScript严格模式(“use strict”)是ECMAScript 5引入的运行模式,旨在通过更严格的语法和行为规范提升代码质量、安全性及性能。

一、设立目的
严格模式的核心目标包括:

  1. 消除语法不合理性:减少因语言特性导致的怪异行为(如隐式全局变量)。
  2. 增强安全性:禁止不安全的操作(如删除不可配置属性)。
  3. 提升性能:通过静态绑定等机制优化编译器效率。
  4. 兼容未来版本:为后续ECMAScript规范(如块级作用域)奠定基础。

二、启用方式
严格模式通过"use strict"指令激活,需置于代码顶部:

  1. 全局启用:将指令放在脚本文件第一行(或非实际执行语句后,如空分号后)。若指令不在首行,则整个文件以正常模式运行。
  2. 函数内启用:将指令置于函数体第一行,仅该函数生效。
  3. 模块化变通:通过立即执行函数(IIFE)包裹整个脚本,实现全局严格模式且便于文件合并。

三、语法与行为变更
严格模式对以下行为进行限制或修改:

  1. 变量声明:必须显式使用var、let或const,隐式创建全局变量会报错。
  2. 静态绑定

    禁止with语句,因其动态绑定导致编译时无法确定属性归属。

    eval创建独立作用域,不再污染全局环境。

  3. 安全增强

    this默认指向undefined(非函数上下文),避免意外指向全局对象。

    禁止通过arguments.caller或arguments.arguments访问调用栈。

  4. 删除限制:仅允许删除configurable: true的属性,否则报错。
  5. 显式报错:对只读属性赋值、修改禁止扩展的对象等操作会直接抛出错误。
  6. 重名错误:对象属性或函数参数重名会触发语法错误。
  7. 八进制禁用:数字以0开头(如0100)会报错。
  8. arguments对象限制

    禁止赋值或修改其追踪参数变化的能力。

    禁用arguments.callee,影响匿名递归函数。

  9. 函数声明位置:仅允许在全局或函数作用域顶层声明函数,禁止在代码块(如if、for)内声明。
  10. 保留字扩展:新增implements、interface等保留字,用作变量名会报错。

四、兼容性与影响
严格模式在主流浏览器(如IE 10+)中均支持,但需注意:

  • 旧版浏览器会忽略"use strict",代码仍以正常模式运行。
  • 混合模式(部分严格、部分正常)可能导致意外行为,需谨慎合并文件。

严格模式通过强制规范编码习惯,帮助开发者提前发现潜在问题,是提升代码健壮性的重要工具。