返回

谁才是this指向的真正主人?对this指针最全的认识

前端

正文

谈起this, JavaScript中这个特殊的,总会令人感觉扑朔迷离. 初学者在刚接触到this时,更是晕头转向,摸不着头脑. 究其原因,是this的指向具有动态性和上下文相关性,即this的指向并不是一成不变的,而是根据不同的执行上下文和函数调用的方式,this的指向会动态变化.

因此,想要真正理解this的指向,需要从执行上下文和函数调用的方式这两个角度入手.

执行上下文

执行上下文,是指一段代码在执行过程中,函数栈中所捕获的变量对象和值的环境,包括全局执行上下文和当前函数调用时的局部执行上下文.

  • 全局执行上下文: 在脚本开始执行时,首先创建一个全局执行上下文,它与window对象相关,其中包含了所有全局变量和函数.

  • 局部执行上下文: 当函数被调用时,会创建一个新的局部执行上下文,它包含了该函数的形参变量、函数声明等,以及该函数调用时所捕获的变量对象.

函数调用方式

函数调用方式,是指在调用函数时,函数的参数是如何传递的. 函数的调用方式可以分为显式绑定和隐式绑定两种.

  • 显式绑定: 显式绑定是指在调用函数时,明确指定this的指向,比如使用call()、apply()、bind()方法.

  • 隐式绑定: 隐式绑定是指在调用函数时,this的指向是根据执行上下文和函数的调用方式自动确定的. 隐式绑定又可以分为普通函数调用、方法调用和构造函数调用三种形式.

this的指向

this的指向,是指在函数体中,this关键字所指向的对象. this的指向与函数的调用方式和函数体中的绑定方式有关,一般可分为显式绑定和隐式绑定两大类.

  • 显式绑定: 当使用call()、apply()、bind()方法显式绑定this的指向时,this的指向由显式绑定的对象决定.

  • 隐式绑定: 当不使用显式绑定方法时,this的指向由执行上下文和函数的调用方式隐式决定.

  • 普通函数调用: 当普通函数被调用时,this的指向为全局执行上下文中的window对象.

  • 方法调用: 当对象的方法被调用时,this的指向为该方法所属的对象.

  • 构造函数调用: 当构造函数被调用时,this的指向为新创建的对象.

this指向的全局和对象视角

从全局的角度来看,this总是指向window对象,这是因为window对象是全局执行上下文的根对象.

从对象的角度来看,this指向的是调用该方法的对象. 比如,当我们调用一个对象的某个方法时,this指向的就是该对象.

总结

this的指向,是JavaScript中一个非常重要的概念,理解this的指向,对于理解JavaScript的执行机制和面向对象编程至关重要. 总的来说,this的指向具有动态性和上下文相关性,this的指向由执行上下文和函数的调用方式共同决定. 在实际开发中,我们需要注意this的指向,避免出现this指向错误的问题.