在全局上下文中,this 指向 window 对象,var 声明的变量会成为 window(即 this)的属性,而 let/const 不会;非严格模式下全局函数内 this 仍为 window,变量提升使 this.x 可访问但值为 undefined。

在 JavaScript 全局上下文中,this 指向全局对象(浏览器中是 window),而变量提升会影响你对 this 属性和全局变量之间关系的理解。这两者看似独立,实则紧密交织——尤其当你给 this 赋值或读取属性时。
全局上下文里 this 就是 window
在非严格模式下,直接在脚本顶层写 this,它就等于 window:
console.log(this === window); // truethis.name = 'Alice'; console.log(window.name); // 'Alice'- 反过来也成立:
window.age = 25; console.log(this.age); // 25
这说明:在全局作用域中,this 和 window 是同一对象的两个引用,操作任一者都会反映到另一个上。
var 声明的变量会挂到 window(也就是 this)上
使用 var 声明的全局变量,会在变量提升阶段自动成为 window 的属性,等价于给 this 添加属性:
var user = 'Bob'; console.log(this.user); // 'Bob'console.log(window.user); // 'Bob'- 但注意:
let user = 'Bob';或const user = 'Bob';不会出现在window上,也无法通过this.user访问
函数调用时的 this 仍由全局上下文决定
在全局中定义并直接调用的普通函数,其内部 this 默认仍是 window(非严格模式):
function say() { console.log(this === window); } say(); // true- 本质是
window.say()的简写,所以调用者是window - 严格模式下例外:
"use strict"; function say() { console.log(this); }→ 输出undefined
变量提升如何影响 this 的表现
变量提升本身不改变 this 的指向,但它让“给 this 赋值”和“读取 this 属性”的时机变得微妙:
console.log(this.x); // undefined(x 已声明但未赋值)var x = 10;- 因为
var x提升后初始化为undefined,相当于window.x = undefined,所以this.x可安全访问,不会报错 - 但
let y = 20;不提升,console.log(this.y)会报ReferenceError
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











