什么是this关键字_Javascript中它指向什么

this的值在函数调用时动态确定,指向执行上下文的“主人”对象:普通调用指向全局对象或undefined,方法调用指向调用对象,构造调用指向新实例,显式绑定可强制指定,箭头函数则继承外层this且不可变。

this 是 JavaScript 中一个特殊的关键字,它的值**不是在函数定义时确定的,而是在函数被调用时动态决定的**。它指向当前执行上下文(execution context)中的“主人”对象,也就是**谁调用了这个函数,this 通常就指向谁**——但有例外,取决于调用方式。

普通函数调用:this 指向全局对象(非严格模式)或 undefined(严格模式)

直接写 foo() 调用,没有点号、没有绑定、没有 new:

  • 非严格模式下,this 指向 window(浏览器)或 global(Node.js)
  • 严格模式下,thisundefined

例如:

function say() { console.log(this); }
say(); // 非严格:window;严格:undefined

方法调用:this 指向调用它的那个对象

当函数作为对象的属性被调用(即用 obj.method() 形式),this 指向该对象:

  • person.getName()this 指向 person
  • 注意:只是赋值引用后调用会丢失 this,比如 const fn = obj.method; fn(); 就退化为普通调用

构造函数调用:this 指向新创建的实例

new 关键字调用函数时,JavaScript 会自动创建一个空对象,并把 this 绑定到它身上:

  • new Person()this 是一个新的 Person 实例
  • 函数内部可通过 this.xxx = xxx 给实例添加属性

显式绑定与箭头函数:this 不可变

callapplybind 可强制指定 this 值;而箭头函数没有自己的 this,它会沿作用域链向上查找外层普通函数的 this,且无法被修改:

  • obj.fn.call(otherObj)this 强制为 otherObj
  • const arrow = () => console.log(this);this 和定义时外层函数一致,调用时不能改