JavaScript 严格模式核心机制与行为详解

作者:纸飞机

时间:2026-10-22

浏览:638

本文详解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。

  1. 尝试为具有只读特性的属性赋值时,严格模式会抛出TypeError异常。
  2. 对configurable特性为false的不可配置属性使用delete操作符,严格模式会抛出TypeError异常。
  3. 尝试向extensible特性为false的不可扩展对象添加新属性时,严格模式会抛出TypeError异常。
  4. 在使用对象字面量定义对象时,严格模式要求所有属性名必须唯一,重复的属性名被视为语法错误。

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属性,就会报错。

 

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章