JavaScript严格模式(“use strict”)是ECMAScript 5引入的运行模式,旨在通过更严格的语法和行为规范提升代码质量、安全性及性能。
一、设立目的
严格模式的核心目标包括:
- 消除语法不合理性:减少因语言特性导致的怪异行为(如隐式全局变量)。
- 增强安全性:禁止不安全的操作(如删除不可配置属性)。
- 提升性能:通过静态绑定等机制优化编译器效率。
- 兼容未来版本:为后续ECMAScript规范(如块级作用域)奠定基础。
二、启用方式
严格模式通过"use strict"指令激活,需置于代码顶部:
- 全局启用:将指令放在脚本文件第一行(或非实际执行语句后,如空分号后)。若指令不在首行,则整个文件以正常模式运行。
- 函数内启用:将指令置于函数体第一行,仅该函数生效。
- 模块化变通:通过立即执行函数(IIFE)包裹整个脚本,实现全局严格模式且便于文件合并。
三、语法与行为变更
严格模式对以下行为进行限制或修改:
- 变量声明:必须显式使用var、let或const,隐式创建全局变量会报错。
- 静态绑定:
禁止with语句,因其动态绑定导致编译时无法确定属性归属。
eval创建独立作用域,不再污染全局环境。
- 安全增强:
this默认指向undefined(非函数上下文),避免意外指向全局对象。
禁止通过arguments.caller或arguments.arguments访问调用栈。
- 删除限制:仅允许删除configurable: true的属性,否则报错。
- 显式报错:对只读属性赋值、修改禁止扩展的对象等操作会直接抛出错误。
- 重名错误:对象属性或函数参数重名会触发语法错误。
- 八进制禁用:数字以0开头(如0100)会报错。
- arguments对象限制:
禁止赋值或修改其追踪参数变化的能力。
禁用arguments.callee,影响匿名递归函数。
- 函数声明位置:仅允许在全局或函数作用域顶层声明函数,禁止在代码块(如if、for)内声明。
- 保留字扩展:新增implements、interface等保留字,用作变量名会报错。
四、兼容性与影响
严格模式在主流浏览器(如IE 10+)中均支持,但需注意:
- 旧版浏览器会忽略"use strict",代码仍以正常模式运行。
- 混合模式(部分严格、部分正常)可能导致意外行为,需谨慎合并文件。
严格模式通过强制规范编码习惯,帮助开发者提前发现潜在问题,是提升代码健壮性的重要工具。