this的值在函数调用时动态确定,指向执行上下文的“主人”对象:普通调用指向全局对象或undefined,方法调用指向调用对象,构造调用指向新实例,显式绑定可强制指定,箭头函数则继承外层this且不可变。
this 是 JavaScript 中一个特殊的关键字,它的值**不是在函数定义时确定的,而是在函数被调用时动态决定的**。它指向当前执行上下文(execution context)中的“主人”对象,也就是**谁调用了这个函数,this 通常就指向谁**——但有例外,取决于调用方式。
直接写 foo() 调用,没有点号、没有绑定、没有 new:
this 指向 window(浏览器)或 global(Node.js)this 是 undefined
例如:
function say() { console.log(this); }
say(); // 非严格:window;严格:undefined
当函数作为对象的属性被调用(即用 obj.method() 形式),t 指向该对象:
his
person.getName() → this 指向 person
const fn = obj.method; fn(); 就退化为普通调用用 new 关键字调用函数时,JavaScript 会自动创建一个空对象,并把 this 绑定到它身上:
new Person() → this 是一个新的 Person 实例this.xxx = xxx 给实例添加属性call、apply、bind 可强制指定 this 值;而箭头函数没有自己的 this,它会沿作用域链向上查找外层普通函数的 this,且无法被修改:
obj.fn.call(otherObj) → this 强制为 otherObj
const arrow = () => console.log(this); → this 和定义时外层函数一致,调用时不能改