浏览器中全局上下文的变量对象就是window对象本身,var/function声明的全局成员自动挂载为window属性,let/const不挂载,全局this恒等于window,上下文生命周期贯穿页面存在期。

在浏览器环境中,JavaScript 的全局上下文与 window 对象本质上是同一个东西——全局上下文的变量对象(Variable Object)就是 window 对象本身。
全局上下文就是 window 对象
当 JavaScript 代码在浏览器中启动时,引擎会创建唯一的全局执行上下文。这个上下文的变量对象不是独立存在的抽象结构,而是直接指向浏览器的全局宿主对象 window。这意味着:
- 所有用
var声明的全局变量,都会作为window的属性被自动挂载,例如var a = 1等价于window.a = 1 - 所有用
function声明的全局函数,也会成为window的方法,例如function foo() {}后可调用window.foo() -
this在全局作用域中就等于window,所以console.log(this === window)返回true
let/const 声明不挂载到 window
虽然 let 和 const 声明的顶层变量也属于全局作用域,但它们**不会**成为 window 的属性:
-
let b = 2;→window.b是undefined -
const c = 3;→window.c也是undefined - 它们仍存在于全局作用域中,可通过作用域链正常访问,只是不暴露在
window上
全局上下文的生命周期
全局上下文从页面加载完成、JS 开始执行时创建,一直存活到页面卸载(如关闭标签页、刷新、导航离开):
- 它不会因函数执行完毕而销毁,和函数上下文有本质区别
- 所有挂载在
window上的属性和方法,只要页面没销毁,就持续可访问 - 手动删除
window.xxx属性会影响对应全局变量的可访问性(但不影响let/const声明的变量)
注意 this 的一致性
在非严格模式下,全局函数中未绑定 this 时,默认指向 window;严格模式下则为 undefined。但全局上下文本身的 this 始终是 window(浏览器环境),这一点不会因模式改变:
console.log(this === window); // true(无论是否严格模式)function fn() { console.log(this === window); } fn(); // 非严格模式 true,严格模式 false
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











