一篇教会你,this究竟指向谁

69 阅读3分钟

在学习JavaScript时,我们经常能看见this的身影,你是否感到疑惑,为什么有时this指向的是window,有时又指向的是函数内部,你试图寻找他的规律,却发现它总是指向东南西北各处一样,难以琢磨,别急,这一篇文章,让你彻底掌握this指向之迷

一、this的默认绑定

  1. 在全局作用域中调用this,它默认指向的是window(在浏览器的环境中,全局环境为window,而在node.js中,全局环境为global,无论在何环境下,在全局调用的情况下它始终默认指向window)

(1)当在node.js环境下在调用指向window的this image.png

(2)当在node.js环境下在调用指向window的this image.png

  1. 当函数被独立调用时,函数中的this也是指向window

image.png

image.png

二、this的隐式绑定

  1. 当函数被调用时,其中的this指向了调用该函数的直接对象,那么什么是直接对象呢(即直接调用该函数的那一个对象),且看下图

(1)此时obj为调用函数foo的直接对象,此时foo内的this指向了obj image.png

(2)此时obj2为调用函数foo的直接对象,此时foo内的this指向了obj2 image.png

三、this的隐式丢失

  1. 隐式丢失就是说被隐私绑定的函数丢失了他的绑定对象,使得该函数又被默认绑定了window对象,这种情况较为常见且易出错
(1)创建函数别名导致隐式丢失

image.png

从上述代码块可知,由于将obj内的foo函数体赋值给了fn,再通过调用fn导致其中的this并非指向调用foo的obj,而是指向了全局对象window,导致了this的隐式丢失,

实际上代码被执行了下图所示的样子 image.png

(2)函数作为参数被传递导致this的丢失

image.png

从上图代码块可知,由于将obj调用出的foo当做参数传入fn中,使得bar接受到了foo的函数体,再调用bar时,与obj毫无关系,从而使得this隐式丢失,指向了window

实际上代码被执行了下图所示的样子 image.png

四、this的显示绑定

1.通过call(),apply(),bind()等方法把对象绑定到this上,叫做显示绑定

(1)call(object,arg1,arg2,arg3.......)'将对象名传入,可使得该函数的this指向该对象,并允许你逐个传递参数'

image.png

(2) apply(object,[args])apply方法与call方法非常相似,但参数是以数组的形式传递的

image.png

(3)bind(object,arg1,arg2....)方法不会立即调用函数,而是创建一个新函数,并将this值永久绑定到指定的对象。需要在绑定时传递部分参数,也可以在调用新函数时传递剩余参数

绑定时便传入参数 image.png

绑定后,调用时传入参数

image.png

五、箭头函数中的this

  1. 箭头函数没有自己的this,它的this继承于外层作用域

指向外层作用域window中的num=1 image.png

this继承于外层fn作用域,指向obj中的num=3

image.png

六、总结

  1. this是一个特殊的关键字,它的值取决于函数的调用方式,而不是定义位置,也就是说,this指向的是当前执行代码的上下文对象,它的值是在函数被调用时就确定的,而非函数被定义时确定的

  2. 普通函数的this取决于调用方式

  3. 箭头函数的this继承于外层作用域

  4. 使用callapplybind可以显示控制this

this的使用方法就分享到这