在学习JavaScript时,我们经常能看见this的身影,你是否感到疑惑,为什么有时this指向的是window,有时又指向的是函数内部,你试图寻找他的规律,却发现它总是指向东南西北各处一样,难以琢磨,别急,这一篇文章,让你彻底掌握this指向之迷
一、this的默认绑定
- 在全局作用域中调用this,它默认指向的是window(在浏览器的环境中,全局环境为window,而在node.js中,全局环境为global,无论在何环境下,在全局调用的情况下它始终默认指向window)
(1)当在node.js环境下在调用指向window的this
(2)当在node.js环境下在调用指向window的this
- 当函数被独立调用时,函数中的this也是指向
window
二、this的隐式绑定
- 当函数被调用时,其中的this指向了调用该函数的直接对象,那么什么是直接对象呢(即直接调用该函数的那一个对象),且看下图
(1)此时obj为调用函数foo的直接对象,此时foo内的this指向了obj
(2)此时obj2为调用函数foo的直接对象,此时foo内的this指向了obj2
三、this的隐式丢失
- 隐式丢失就是说被隐私绑定的函数丢失了他的绑定对象,使得该函数又被默认绑定了window对象,这种情况较为常见且易出错
(1)创建函数别名导致隐式丢失
从上述代码块可知,由于将obj内的foo函数体赋值给了fn,再通过调用fn导致其中的this并非指向调用foo的obj,而是指向了全局对象window,导致了this的隐式丢失,
实际上代码被执行了下图所示的样子
(2)函数作为参数被传递导致this的丢失
从上图代码块可知,由于将obj调用出的foo当做参数传入fn中,使得bar接受到了foo的函数体,再调用bar时,与obj毫无关系,从而使得this隐式丢失,指向了window
实际上代码被执行了下图所示的样子
四、this的显示绑定
1.通过call(),apply(),bind()等方法把对象绑定到this上,叫做显示绑定
(1)call(object,arg1,arg2,arg3.......)'将对象名传入,可使得该函数的this指向该对象,并允许你逐个传递参数'
(2) apply(object,[args])apply方法与call方法非常相似,但参数是以数组的形式传递的
(3)bind(object,arg1,arg2....)方法不会立即调用函数,而是创建一个新函数,并将this值永久绑定到指定的对象。需要在绑定时传递部分参数,也可以在调用新函数时传递剩余参数
绑定时便传入参数
绑定后,调用时传入参数
五、箭头函数中的this
- 箭头函数没有自己的this,它的this继承于外层作用域
指向外层作用域window中的num=1
this继承于外层fn作用域,指向obj中的num=3
六、总结
-
this是一个特殊的关键字,它的值取决于函数的调用方式,而不是定义位置,也就是说,this指向的是当前执行代码的上下文对象,它的值是在函数被调用时就确定的,而非函数被定义时确定的
-
普通函数的this取决于调用方式
-
箭头函数的this继承于外层作用域
-
使用
call、apply、bind可以显示控制this
this的使用方法就分享到这