window是浏览器中的全局对象,所有未声明的变量和函数默认挂载为其属性,非严格模式下this指向window,但需避免覆盖其原生属性。

在浏览器控制台中,window 就是默认的全局对象,所有直接声明的全局变量和函数,本质上都是它的属性和方法。
Window 是控制台里的“顶层容器”
你在控制台输入 console.log(this),输出的就是 window;输入 this === window,结果为 true。这意味着:只要没进函数、没用严格模式、没进模块作用域,你写的每行代码都运行在 window 的上下文中。
比如:
-
var a = 100;→ 等价于window.a = 100; -
function say() { return "hi"; }→ 等价于window.say = function() { return "hi"; }; -
say();和window.say();效果完全一样
全局变量自动挂载到 window 上
不使用 var、let 或 const 声明的变量(即“裸变量”),会直接成为 window 的可枚举属性:
-
name = "Alice";→window.name立刻可用,且name in window为true -
window.name是浏览器保留属性(用于 iframe 通信),赋值后可能影响页面行为,需谨慎 -
let x = 5;或const y = 10;不会挂到window,它们属于块级作用域,不可被window.x访问
默认绑定下 this 指向 window(非严格模式)
在控制台直接调用普通函数时,this 默认绑定到 window:
-
function checkThis() { console.log(this === window); }→ 执行checkThis()输出true - 但启用严格模式:
"use strict"; function check() { console.log(this); }→ 输出undefined,不再自动绑定window - 定时器回调如
setTimeout(function(){ console.log(this); }, 100)中的this也指向window(非严格模式)
注意 window 的特殊性与风险
window 不只是“全局对象”,它还承载大量浏览器 API(alert、location、history 等),也包含许多易被意外覆盖的属性:
-
window.length、window.closed、window.status都是只读或有副作用的原生属性 - 避免用
var location = ...,否则可能遮蔽window.location,导致跳转失效 - 现代开发推荐用模块化(
type="module")或显式声明(const/let),减少对window的隐式依赖











