面试常考点:翻过this这座大山!!!(大量实例)
前言
想象一下,JavaScript 中的 this
就像一位“变身大师”,它的外表看起来可能会让你感到困惑,但是一旦你了解了它的规则,你就可以轻松驾驭它的力量!
有时候,this
就像是在一场盛大的派对上,它会随着调用它的方式而变化,就像是一位随着聚会气氛改变服装的人一样。有时候它会认为自己是全球明星,指向全局(全局对象),有时候它会觉得自己是个局部的大亨,指向了函数的调用者。有时候它会把你带到陌生的地方,有时候它又会跟着你走。在不同的情况下,this
的指向可能会让你感到困惑,但是一旦你搞清楚了调用它的上下文,你就能准确地知道它指向谁了!
总而言之,掌握 this
就像是学习一门魔法,一旦你掌握了它的规则,你就能在 JavaScript 的世界中游刃有余,创造出令人惊叹的魔法效果!
来来来,和我一起,翻过this这座大山!
1.话题引入
首先大家知道这里面的结果是什么嘛?输出结果是涛哥,那么为什么呢?
2.this指向
我们先举出一些例子来说明this的指向
this指向window
this指向window
this指向obj
那么是为什么呢?
3.默认绑定
默认绑定可以简单理解为里面拥有this的函数是直接调用的,那么this就会指向全局。
我们看这道题this是指向哪里呢?这个符合默认绑定,哪怕一开始函数不是直接调用,但是碰见最终拥有this的函数时,是直接调用,所以指向window。
哪怕是这道题,嵌套了非常多的函数,最终this也是指向window。
4.隐式绑定
很明显根据默认绑定规则我们知道是1
很明显根据默认绑定规则我们知道是2
这个函数就和之前的情况有所不同了,因为函数不是直接调用,是通过对象来进行调用的,因此我们不能用默认绑定的规则了,而是一种新的隐式绑定规则。
根据这种情况,谁调用这个函数,那么this就指向谁,因此结果为1
哪怕在多层逐级调用中,this也是指向本层函数的最近一级调用者,称之为就近原则。因此这里为1
这里的结果是undefined(最后没有括号)因为这里的this相当于直接在对象里面了,而对象里面直接打印this就是指向全局的。
5.显式绑定
我们可以通过显式绑定来改变this的指向
call的显式绑定
这里我们在foo调用函数的同时将里面的this指向obj,最终会打印1,call可调用函数,可接正常参数
apply的显式绑定
apply和call的用法类似,就是接的参数必须用数组表示。 但是第一个参数一定是给this的指向,后面才接实参!!!
bind的显式绑定
bind的绑定是不会带有函数调用的,同时接正常参数,不接数组。必须使用变量来接返回的改变指向的函数
6.new绑定
接下来我们就可以把new创造函数实例对象的过程搞得一清二楚了!
首先我们会创建一个空的函数对象,然后改变this指向实例对象(不然是指向全局的),然后赋值,然后完成原型继承,然后返回对象。
7.箭头函数的this非它拥有
写在箭头函数里的this,因为箭头函数并不含有this,这个this是它外一层的this。 比如这一题的结果,是window。
那么我们最后再来一道题,大家可以看见,首先箭头函数里里面是没有this的,因此this在箭头函数外b函数内。在调用b函数的时候,我们可以发现是被调用的,因此隐式绑定,最后结果为1。
小结
-
全局上下文中的
this
:- 在全局作用域中,
this
指向全局对象,通常是window
对象。但在严格模式下,全局上下文中的this
是undefined
。
- 在全局作用域中,
-
函数中的
this
:- 当函数被作为普通函数调用时,
this
指向全局对象或者undefined
(在严格模式下)。 - 当函数作为对象的方法调用时,
this
指向调用该方法的对象。
- 当函数被作为普通函数调用时,
-
构造函数中的
this
:- 在构造函数中,
this
指向正在创建的实例对象。
- 在构造函数中,
-
使用
call()
、apply()
或bind()
显式设置this
:call()
和apply()
方法可以用来在调用函数时显式地设置this
的值。它们的第一个参数就是要设置的this
的值。bind()
方法会创建一个新的函数,并把this
绑定到指定的值,而不会立即执行函数。
-
箭头函数中的
this
:- 箭头函数的
this
指向它所在的词法作用域中的this
,而不是动态绑定。
- 箭头函数的
-
事件处理函数中的
this
:- 在事件处理函数中,
this
通常指向触发事件的 DOM 元素。
- 在事件处理函数中,
-
DOM 中的
this
:- 在 DOM 事件处理函数中,
this
通常指向触发事件的 DOM 元素。
- 在 DOM 事件处理函数中,
了解 this
的行为是 JavaScript 中的一项重要技能,因为它决定了代码的行为和上下文。
转载自:https://juejin.cn/post/7366939722872946714