当前位置: 首页 > article >正文

小白一命速通JS中的windowglobal对象

笔者注意到JS中的window对象与global对象经常被混淆,尽管它们在相当一部分使用情况下可以等同,但是本质上仍然存在很多不同,下面是对于两者的详细拆解


1. window 对象

  • 定义window 对象表示 浏览器环境中的全局上下文。
  • 作用域:它是浏览器中运行的任何 JavaScript 代码的顶级对象。
  • 关键特性
    • 包含所有通过 var 声明的 全局变量和函数(在非模块脚本中)。
    • 表示浏览器的 窗口框架,代码运行在其中。
    • 包含浏览器特定的属性和方法,如:
      • window.location(当前 URL)
      • window.document(页面的 DOM 树)
      • window.alert()(弹出框)
    • 隐式引用/自动挂载:通过 var 声明或未使用 let/const/var 创建的全局变量成为 window 的属性。 隐式引用
示例
console.log(window.location.href); // 打印当前页面的 URL
window.alert("Hello!"); // 显示一个警告对话框

2. global对象

  • 定义global对象是所有 JavaScript 环境中(浏览器、Node.js 或其他)可用的顶级对象。
  • 作用域:它作为容器,包含所有全局可访问的实体。
  • 关键特性
    • 它根据 执行环境 的不同而有所不同:
      • 在浏览器中,global对象是 window
      • 在 Node.js 中,global对象是 global
      • 在 Web Workers 中,global对象是 self
    • 包含全局内置对象,如 MathDateJSON 等。
Node.js 示例
console.log(global.setTimeout); // 通过 global 访问 setTimeout
浏览器示例
console.log(window === global); // 在浏览器中为 true

3. 关键区别

方面window 对象global对象
作用域仅限于浏览器通用(浏览器、Node.js 等)
环境仅在浏览器中可用取决于环境(windowglobalself
内容包含浏览器特定的 API 和方法包含标准的全局对象(MathJSON 等)
全局变量作为 window 的属性可访问作为全局对象的属性可访问
Node.js 支持不可用使用 global 代替

4. 使用 globalThis 实现通用访问

  • ES2020 引入了 globalThis,提供了一种不依赖于环境的通用方式来访问全局对象:
    • 在浏览器中,globalThis 等同于 window
    • 在 Node.js 中,globalThis 等同于 global
    • 在 Web Workers 中,globalThis 等同于 self
示例
// 在不同环境中都有效
console.log(globalThis.setTimeout === setTimeout); // true

5. 重叠与差异

重叠

在浏览器中:

var x = 10; // 声明一个全局变量
console.log(window.x); // 10(与 global.x 相同)
差异
// Node.js 示例
global.x = 10; // 在 global 中可用
console.log(global.x); // 10
console.log(window.x); // 错误:window 未定义

结论

  • 当处理与浏览器相关的功能(如 DOM 操作、位置、警告等)时,使用 window 对象
  • 使用 全局对象(或 globalThis 以确保跨环境兼容性)编写与环境无关的代码。

http://www.kler.cn/a/524452.html

相关文章:

  • PySide(PyQT)进行SQLite数据库编辑和前端展示的基本操作
  • FreeRTOS学习 --- 动态任务创建和删除的详细过程
  • 快速提升网站收录:内容创作的艺术
  • LangGraph系列-1:用LangGraph构建简单聊天机器人
  • MIMIC-IV数据部署(博主较忙,缓慢更新)
  • 智慧园区系统集成解决方案构建智能管理新模式与发展蓝图
  • Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手
  • Spring项目部署到Docker
  • C# 9.0记录类型:解锁开发效率的魔法密码
  • 17、智能驾驶硬件架构安全设计一般原则
  • Linux学习笔记——用户管理
  • 【回溯+剪枝】找出所有子集的异或总和再求和 全排列Ⅱ
  • JUC--ConcurrentHashMap底层原理
  • 如何创建一个线程池
  • DeepSeek核心贡献:将SFT和RL统一的数学公式
  • C# INotifyPropertyChanged接口在list类型中的应用
  • 大一计算机的自学总结:异或运算
  • 大数据相关职位介绍之一(数据分析,数据开发,数据产品经理,数据运营)
  • 【go语言】函数
  • springboot基于SpringBoot的养老院管理系统设计与实现
  • RDK X5运行DeepSeek-R1-Distill-Qwen-1.5B,体验长思维链的语言大模型!
  • 芯片AI深度实战:基础篇之Ollama
  • GAEA 社区:从用户到共同创造者
  • 线程概念、操作
  • Python NumPy(6):修改数组形状、翻转数组、修改数组维度
  • MySQL查询优化(三):深度解读 MySQL客户端和服务端协议