JavaScript 严格模式核心机制与行为详解
本文详解JavaScript严格模式(use strict)的开启方式及其对全局变量、变量删除、对象操作、函数参数及this指向的影响。严格模式通过禁止隐式全局变量、限制delete操作、要求参数唯一及固定this绑定,提升代码安全性与执行效率,是现代前端开发的基础规范。
严格模式的启用方式
严格模式通过在全局或函数作用域中声明字符串字面量“use strict”来启用,该字符串本身不赋值给任何变量,仅作为解析器的指令。
若在全局作用域声明“use strict”,则整个脚本文件均遵循严格模式;若仅在函数内部声明,则仅该函数及其内部作用域受严格模式约束。
全局变量与隐式声明限制
严格模式禁止隐式创建全局变量,任何未声明的赋值操作将直接抛出ReferenceError异常。
a="test"
在严格模式下执行上述未声明赋值代码会触发报错,而在非严格模式下该操作会被静默处理并创建全局变量。
变量删除操作的差异
严格模式对变量删除操作施加了更严格的限制,非严格模式下的delete行为在此模式下将被禁止。
JavaScript中var声明的变量存在三种不同的作用域情形,其可删除性各不相同。
- 通过var声明的全局变量
- 通过var声明的局部变量
- 在eval()函数中声明的全局变量
前两种情况下的变量无法使用delete操作符删除,只有第三种情况在特定条件下可能涉及删除逻辑。
第一种情况中,通过var声明的全局变量虽作为宿主对象(如浏览器中的window)的属性存在,但其内部特性configurable被设为false,因此无法被删除。
第二种情况中,局部变量依附于函数执行上下文,不具备直接的可访问性,因此无法通过delete操作符进行删除。
第三种情况涉及eval()函数的特殊行为,将在后续关于eval的讨论中详细阐述。
回到严格模式的主题,在非严格模式下执行delete操作通常会返回false且静默失败,不会抛出异常。
在严格模式下尝试删除变量会直接抛出TypeError异常,强制开发者避免此类操作。
对象属性操作规范
严格模式对对象属性的操作进行了规范化,特定情况下的对象操作将导致语法或运行时错误。
在以下特定场景中对对象属性进行赋值、删除或扩展操作,严格模式会抛出错误以阻止潜在bug。
- 尝试为具有只读特性的属性赋值时,严格模式会抛出TypeError异常。
- 对configurable特性为false的不可配置属性使用delete操作符,严格模式会抛出TypeError异常。
- 尝试向extensible特性为false的不可扩展对象添加新属性时,严格模式会抛出TypeError异常。
- 在使用对象字面量定义对象时,严格模式要求所有属性名必须唯一,重复的属性名被视为语法错误。
var person={
name:"1",
name:"2"
}
在非严格模式下,若对象字面量中出现重复属性名,引擎通常会采用后出现的值覆盖前者;而在严格模式下,这将直接导致SyntaxError报错。
函数定义与参数限制
严格模式对函数的定义和参数规范提出了更严格的要求,旨在消除JavaScript中一些模糊的函数行为。
在严格模式下,函数定义中的参数名称必须唯一,不允许出现重复的参数名。
function(n,n){
// todo
}
在非严格模式下,即使函数声明包含重复参数名也不会报错,但访问第一个参数值需通过arguments对象,而直接通过参数名只能访问到最后一个重复的参数。
arguments对象在严格模式与非严格模式下的行为存在显著差异,主要体现在其与命名参数的关联方式上。
在非严格模式下,修改命名参数的值会同步反映在arguments对象中;而在严格模式下,两者相互独立,修改命名参数不会影响arguments对象。
严格模式废除了arguments.callee(指向函数本身)和arguments.caller(指向调用函数)这两个属性,访问它们将抛出TypeError异常。
在严格模式下,函数名不能使用JavaScript的保留字,否则将导致SyntaxError语法错误。
**严格模式下,函数只能在脚本顶层或另一个函数内部声明,在if语句等控制流块中声明函数会导致语法错误。**
if(true){
function(){
// 严格模式下报错
}
}
this指向的行为变更
严格模式改变了this关键字的行为,使其指向更加明确和可预测,避免了非严格模式下的隐式绑定问题。
在非严格模式下,使用apply()或call()方法传入null或undefined时,this会被隐式转换为全局对象;而在严格模式下,this始终严格等于传入的值,即使该值为null或undefined,不会发生隐式转换。
var a="1";
function test(){
console.log(this.a)
}
test.call(null) 在非严格模式下会输出1,严格模式下this就指代的就是null,null没有a属性,就会报错。
JS动态构建复杂嵌套JSON对象的方法
2026-11-05 15:41:52
JS负数取余为什么是负数?详解余数与模运算区别
2026-11-05 13:34:41
JS 解压出现乱码或报错怎么解决?
2026-11-05 12:32:38
JS 中 startsWith、indexOf 与正则判断字符串前缀的对比
2026-11-04 22:19:43
JS解析Excel后怎么将数据转换为JSON格式
2026-11-04 20:58:28
