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

顶层函数中this指向疑问:构造函数场景的表现差异

关于JavaScript中this在构造函数里的指向问题

嘿,这个疑问太典型了,很多刚吃透this基本规则的开发者都会在这里卡一下——核心问题其实是你混淆了函数的「定义」和「调用方式」对this的影响,咱们一步步拆解:

首先先重申this的核心铁则:this的指向从来不是由函数定义的位置决定的,完全取决于函数被调用的方式。

回到你给出的Person函数:

function Person(first, last, age, gender, interests) { 
  this.name = { first, last }; 
  this.age = age; 
  this.gender = gender; 
  this.interests = interests; 
};

这个函数本身只是一个普通的函数定义,它里面的this到底指向哪里,完全看你怎么调用它:

1. 当作普通函数直接调用 → this绑定到window(非严格模式)

如果你直接写:

Person('Jane', 'Smith', 28, 'female', ['reading', 'hiking']);

这时候它就是个普通函数调用,在非严格模式下,this会默认绑定到全局对象(浏览器环境里就是window)。这时候你去查看window.name、window.age,就能看到刚才传入的属性,和你最开始的预期完全一致。

2. 用new关键字当作构造函数调用 → this绑定到新创建的实例

但如果用new来调用它:

const person1 = new Person('Jane', 'Smith', 28, 'female', ['reading', 'hiking']);

这时候new关键字会触发一套特殊的绑定规则:

  • 首先创建一个全新的空对象
  • 把这个空对象的原型链指向Person.prototype
  • 将这个空对象绑定为函数内部的this
  • 如果函数没有显式返回其他对象,就自动返回这个新创建的对象

所以这时候函数里的this不再是window,而是刚才创建的person1实例,所有属性都会挂到这个实例上——这也是构造函数的核心作用。

额外补充:严格模式下的差异

如果你的代码在严格模式(开头加'use strict')下运行,普通函数调用时的this会变成undefined,而不是window。这时候直接调用Person会报错,因为你不能给undefined添加属性。

总结一下:你之前的认知偏差在于,误以为构造函数里的this天生就绑定到某个“所属对象”,但实际上是new关键字改变了this的指向,让它绑定到新实例上;如果不用new,它就是个普通函数,this还是遵循默认绑定规则。

内容的提问来源于stack exchange,提问作者Leviathan_the_Great

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:14:02