在浏览器中,window 对象处于整个 BOM(浏览器对象模型)的最顶层。它是一个“双重身份”的对象:既代表浏览器的窗口实例,也是 JavaScript 代码运行的全局作用域。这意味着你在全局作用域中定义的任何变量或函数,都会自动成为 window 对象的属性。
14.1.1 全局作用域
当你在顶层代码(即不在任何函数或块内)声明变量时,它们会被挂载到 window 上:
var appName = "MyApp";
console.log(window.appName); // "MyApp"
function sayHello() {
console.log("Hello");
}
window.sayHello(); // "Hello"
注意:使用 let、const 声明的全局变量虽然也在全局作用域,但不会被附加到 window 对象上(它们存在于全局作用域的词法环境中,但不属于 window 的属性)。这个细节在实际开发中很重要——避免污染 window 是良好实践,大量全局变量容易造成命名冲突和维护困难。
浏览器内置的大量 API 也是通过 window 暴露的,例如 document、console、setTimeout、fetch、alert 等。你可以直接调用 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 注意事项
- 避免全局污染:尽量不要在全局作用域下挂载自定义属性或函数,而是使用模块(ESM)、命名空间或立即执行函数来隔离作用域。
- 弹窗拦截:所有依赖
window.open的窗口控制,都必须由用户明确的行为(如点击事件)直接触发,异步回调中调用通常会被拦截。 - 兼容性:窗口大小和位置控制方法实际上仅对独立弹窗有效,不要花费过多精力去适配它们的精确表现,现代 Web 应用更关注视口滚动和响应式布局。
window 作为全局对象和窗口控制的桥梁,是 BOM 中第一个需要深入掌握的对象。接下来对 location、navigator、history 等对象的学习,也会围绕 window 这个核心展开。