全局执行上下文在严格模式下this为undefined、禁止隐式全局变量,但其创建时机、生命周期和结构不变;var声明仍挂载全局对象,let/const不挂载且不可通过this访问。

全局执行上下文本身不会因严格模式而改变类型或生命周期,但严格模式会显著影响其中 this 的值和变量声明行为。
全局上下文中 this 的指向差异
无论是否启用严格模式,全局执行上下文始终存在且唯一,但它内部的 this 值不同:
- 非严格模式下:this 指向全局对象(浏览器中为
window,Node.js 中为global) - 严格模式下:this 的值为
undefined
例如:
"use strict"; console.log(this === window); // false(浏览器中) console.log(this); // undefined // 非严格模式下(无"use strict") console.log(this === window); // true
var / let / const 在全局上下文中的表现
严格模式不改变变量声明方式,但会影响隐式全局变量的创建:
- 用
var声明的变量会自动成为全局对象的属性(window.xxx),非严格与严格模式下都如此 - 用
let或const声明的变量不会挂载到全局对象上,且在全局上下文中 this 无法访问它们 - 非严格模式下,未声明直接赋值(如
name = "Alice")会创建隐式全局变量;严格模式下会直接报ReferenceError
函数调用时的默认 this 行为
虽然这是函数执行上下文的范畴,但它由全局上下文触发,因此密切相关:
- 在全局作用域中直接调用普通函数(如
foo()),该函数的执行上下文中的 this 取决于严格模式 - 非严格模式:函数内 this 指向
window - 严格模式:函数内 this 为
undefined
这意味着同一段代码,在是否启用严格模式下,console.log(this) 在函数体内输出完全不同。
全局上下文的创建与执行阶段不变性
严格模式不影响全局执行上下文的创建时机、生命周期或结构:
- 它总是在脚本加载完成、执行第一行代码前创建
- 变量提升(hoisting)对
var和函数声明依然发生,let/const仍存在暂时性死区(TDZ) - 作用域链和变量对象的机制保持一致,只是部分运行时约束更严格
严格模式本质是给全局(及所有嵌套)执行上下文增加了一组运行时检查规则,而非重构上下文本身。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











