人人都会AI编程

14.1 window 全局对象:全局作用域、窗口控制

更新时间:2026-07-11

在浏览器中,window 对象处于整个 BOM(浏览器对象模型)的最顶层。它是一个“双重身份”的对象:既代表浏览器的窗口实例,也是 JavaScript 代码运行的全局作用域。这意味着你在全局作用域中定义的任何变量或函数,都会自动成为 window 对象的属性。

14.1.1 全局作用域

当你在顶层代码(即不在任何函数或块内)声明变量时,它们会被挂载到 window 上:

var appName = "MyApp";
console.log(window.appName); // "MyApp"

function sayHello() {
  console.log("Hello");
}
window.sayHello(); // "Hello"

注意:使用 letconst 声明的全局变量虽然也在全局作用域,但不会被附加到 window 对象上(它们存在于全局作用域的词法环境中,但不属于 window 的属性)。这个细节在实际开发中很重要——避免污染 window 是良好实践,大量全局变量容易造成命名冲突和维护困难。

浏览器内置的大量 API 也是通过 window 暴露的,例如 documentconsolesetTimeoutfetchalert 等。你可以直接调用 fetch()document.getElementById(),本质上都是在调用 window.fetch()window.document。因此,window 是 JavaScript 在浏览器中与宿主环境交互的“入口”。

14.1.2 窗口控制

window 对象提供了一系列方法,用来操控浏览器窗口本身的状态,例如打开新窗口、调整尺寸、滚动页面等。

打开与关闭窗口

  • window.open(url, target, features)

打开一个新的浏览器窗口或标签页。url 是要加载的地址,target 指定打开的目标(_blank 表示新窗口/标签页),features 是一个逗号分隔的字符串,用来控制窗口外观(宽度、高度、是否显示工具栏等)。

  // 打开一个 400x300 的弹窗,不显示工具栏
  const newWin = window.open("https://example.com", "popup", "width=400,height=300,toolbar=no");
  

现代浏览器出于安全和用户体验考虑,会严格限制 window.open 的行为:非用户直接触发的打开操作可能会被拦截(例如在异步回调中直接调用 window.open),并且大部分特性字符串(如隐藏地址栏)已失效。实际开发中,我们通常只是使用它来打开新的标签页。

  • window.close()

关闭当前窗口。需要注意的是,JavaScript 只能关闭通过 window.open() 打开的窗口,不能随意关闭用户手动打开的窗口(浏览器会忽略或触发确认)。

控制窗口位置与大小

这些方法曾是早期 Web 弹窗的标配,但在标签页浏览为主流、浏览器安全策略收紧的今天,它们只能作用于通过 window.open() 打开的独立窗口,对普通标签页无效。

  • window.resizeTo(width, height) — 调整窗口到指定尺寸。
  • window.resizeBy(deltaWidth, deltaHeight) — 相对当前尺寸调整。
  • window.moveTo(x, y) — 移动窗口到指定屏幕坐标。
  • window.moveBy(deltaX, deltaY) — 相对移动窗口。

窗口滚动控制

对于页面内容的滚动,window 提供了非常实用的方法:

  • window.scrollTo(x, y)window.scrollTo(options) — 滚动到指定位置。
  // 滚动到页面顶部
  window.scrollTo(0, 0);
  
  // 平滑滚动到指定位置
  window.scrollTo({
    top: 500,
    left: 0,
    behavior: "smooth"
  });
  
  • window.scrollBy(x, y) — 相对当前位置滚动。
  • window.scrollX / scrollY — 只读属性,获取当前页面的水平和垂直滚动偏移(代替旧的 pageXOffset / pageYOffset)。

这些方法在现代单页应用(SPA)和锚点导航、长列表定位等场景中经常使用,是实现平滑滚动或自定义滚动行为的底层基础。

打印与聚焦

  • window.print() — 调起浏览器的打印对话框。
  • window.focus() — 让窗口获得焦点(适用于弹窗),在现代浏览器中对主窗口无效。
  • window.blur() — 让窗口失去焦点。

14.1.3 注意事项

  1. 避免全局污染:尽量不要在全局作用域下挂载自定义属性或函数,而是使用模块(ESM)、命名空间或立即执行函数来隔离作用域。
  2. 弹窗拦截:所有依赖 window.open 的窗口控制,都必须由用户明确的行为(如点击事件)直接触发,异步回调中调用通常会被拦截。
  3. 兼容性:窗口大小和位置控制方法实际上仅对独立弹窗有效,不要花费过多精力去适配它们的精确表现,现代 Web 应用更关注视口滚动和响应式布局。

window 作为全局对象和窗口控制的桥梁,是 BOM 中第一个需要深入掌握的对象。接下来对 locationnavigatorhistory 等对象的学习,也会围绕 window 这个核心展开。