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
相关产品推荐
相关产品推荐

