顶层函数中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
相关产品推荐
相关产品推荐

