You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS对象字面量中this为何指向window?新手技术问询

为什么对象字面量里的this不指向对象本身?

嘿,这个问题绝对是JavaScript新手最容易踩的坑之一,我当初刚学的时候也懵了好久,咱一步步给你理清楚~

1. 先看你的第一个例子:对象字面量里的this为啥是window?

你写的代码:

var obj = { x: this };
obj.x; // window object

这里的核心是:对象字面量{}在创建的时候,里面的属性值是在当前的执行上下文里计算的,而不是在这个新对象的上下文里。

当你执行var obj = { x: this }这行代码时,整个语句是在全局上下文(非严格模式下)运行的,所以这里的this就取全局上下文的this——也就是window(浏览器环境)。这个x的属性值在对象创建的瞬间就已经确定是window了,和后面的obj没有半毛钱关系。

简单说:对象字面量只是个“值的集合”,它本身不会创建新的执行上下文,里面的this自然就沿用外部的上下文。

2. 为什么函数作为对象属性时,this就指向对象了?

比如这个例子:

var obj = {
  getThis: function() {
    return this;
  }
};
obj.getThis(); // 输出obj对象

这是因为函数的this是在调用的时候才确定的,而不是定义的时候!

当你用obj.getThis()调用这个函数时,函数的执行上下文被绑定到了obj上——也就是“谁调用这个函数,this就指向谁”(这是普通函数调用的规则)。而如果直接调用getThis()(比如把它赋值给变量再调用),this又会变回全局的window了:

var func = obj.getThis;
func(); // 输出window

3. 为啥只有函数能改变this的指向逻辑?

这得先搞清楚this到底是什么:this是函数执行上下文的一个内置属性,只有当函数执行的时候,才会根据调用方式绑定对应的this值。

  • 普通的变量赋值、对象属性赋值,都是在当前的作用域/上下文里直接取值,没有“执行上下文绑定”这个过程,所以this只会沿用当前上下文的值。
  • 而函数不一样,每次执行函数都会创建一个新的执行上下文,这个上下文里的this会根据调用方式(比如obj.func()、new Func()、call/apply/bind)来确定。

你提到的“作用域”和“上下文”的区别也很关键:

  • 作用域是静态的,定义时就确定,它决定了变量的查找范围(比如函数内部能访问外部的变量)。
  • 执行上下文是动态的,函数执行时才创建,它包含了this、变量对象、作用域链这些运行时的信息。

对象本身没有自己的执行上下文,只有函数执行才会触发执行上下文的创建,所以只有函数能改变this的指向逻辑。

总结一下关键点

  • 对象字面量初始化时,属性值的计算依赖外部执行上下文,所以this取外部的(比如全局的window)。
  • 函数的this是调用时绑定的,调用方式决定了this的指向。
  • this是函数执行上下文的专属属性,普通属性赋值没有这个绑定过程。

内容的提问来源于stack exchange,提问作者a.developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:54:54