likes
comments
collection
share

面试常考点:翻过this这座大山!!!(大量实例)

作者站长头像
站长
· 阅读数 25

前言

想象一下,JavaScript 中的 this 就像一位“变身大师”,它的外表看起来可能会让你感到困惑,但是一旦你了解了它的规则,你就可以轻松驾驭它的力量!

有时候,this 就像是在一场盛大的派对上,它会随着调用它的方式而变化,就像是一位随着聚会气氛改变服装的人一样。有时候它会认为自己是全球明星,指向全局(全局对象),有时候它会觉得自己是个局部的大亨,指向了函数的调用者。有时候它会把你带到陌生的地方,有时候它又会跟着你走。在不同的情况下,this 的指向可能会让你感到困惑,但是一旦你搞清楚了调用它的上下文,你就能准确地知道它指向谁了!

总而言之,掌握 this 就像是学习一门魔法,一旦你掌握了它的规则,你就能在 JavaScript 的世界中游刃有余,创造出令人惊叹的魔法效果!

来来来,和我一起,翻过this这座大山!

1.话题引入

面试常考点:翻过this这座大山!!!(大量实例)

首先大家知道这里面的结果是什么嘛?输出结果是涛哥,那么为什么呢?

面试常考点:翻过this这座大山!!!(大量实例)

2.this指向

我们先举出一些例子来说明this的指向 面试常考点:翻过this这座大山!!!(大量实例)

this指向window

面试常考点:翻过this这座大山!!!(大量实例)

this指向window

面试常考点:翻过this这座大山!!!(大量实例)

this指向obj

那么是为什么呢?

3.默认绑定

面试常考点:翻过this这座大山!!!(大量实例)

默认绑定可以简单理解为里面拥有this的函数是直接调用的,那么this就会指向全局。

面试常考点:翻过this这座大山!!!(大量实例)

我们看这道题this是指向哪里呢?这个符合默认绑定,哪怕一开始函数不是直接调用,但是碰见最终拥有this的函数时,是直接调用,所以指向window。

面试常考点:翻过this这座大山!!!(大量实例)

哪怕是这道题,嵌套了非常多的函数,最终this也是指向window。

4.隐式绑定

面试常考点:翻过this这座大山!!!(大量实例)

面试常考点:翻过this这座大山!!!(大量实例)

很明显根据默认绑定规则我们知道是1

面试常考点:翻过this这座大山!!!(大量实例)

很明显根据默认绑定规则我们知道是2

面试常考点:翻过this这座大山!!!(大量实例)

这个函数就和之前的情况有所不同了,因为函数不是直接调用,是通过对象来进行调用的,因此我们不能用默认绑定的规则了,而是一种新的隐式绑定规则。

面试常考点:翻过this这座大山!!!(大量实例)

面试常考点:翻过this这座大山!!!(大量实例)

根据这种情况,谁调用这个函数,那么this就指向谁,因此结果为1

面试常考点:翻过this这座大山!!!(大量实例)

哪怕在多层逐级调用中,this也是指向本层函数的最近一级调用者,称之为就近原则。因此这里为1

面试常考点:翻过this这座大山!!!(大量实例)

这里的结果是undefined(最后没有括号)因为这里的this相当于直接在对象里面了,而对象里面直接打印this就是指向全局的。

5.显式绑定

我们可以通过显式绑定来改变this的指向

call的显式绑定

面试常考点:翻过this这座大山!!!(大量实例)

这里我们在foo调用函数的同时将里面的this指向obj,最终会打印1,call可调用函数,可接正常参数

apply的显式绑定

面试常考点:翻过this这座大山!!!(大量实例)

apply和call的用法类似,就是接的参数必须用数组表示。 但是第一个参数一定是给this的指向,后面才接实参!!!

bind的显式绑定

面试常考点:翻过this这座大山!!!(大量实例)

bind的绑定是不会带有函数调用的,同时接正常参数,不接数组。必须使用变量来接返回的改变指向的函数

面试常考点:翻过this这座大山!!!(大量实例)

6.new绑定

面试常考点:翻过this这座大山!!!(大量实例)

面试常考点:翻过this这座大山!!!(大量实例)

接下来我们就可以把new创造函数实例对象的过程搞得一清二楚了!

首先我们会创建一个空的函数对象,然后改变this指向实例对象(不然是指向全局的),然后赋值,然后完成原型继承,然后返回对象。

7.箭头函数的this非它拥有

面试常考点:翻过this这座大山!!!(大量实例)

写在箭头函数里的this,因为箭头函数并不含有this,这个this是它外一层的this。 比如这一题的结果,是window。

面试常考点:翻过this这座大山!!!(大量实例)

面试常考点:翻过this这座大山!!!(大量实例)

那么我们最后再来一道题,大家可以看见,首先箭头函数里里面是没有this的,因此this在箭头函数外b函数内。在调用b函数的时候,我们可以发现是被调用的,因此隐式绑定,最后结果为1。

小结

  1. 全局上下文中的 this

    • 在全局作用域中,this 指向全局对象,通常是 window 对象。但在严格模式下,全局上下文中的 this 是 undefined
  2. 函数中的 this

    • 当函数被作为普通函数调用时,this 指向全局对象或者 undefined(在严格模式下)。
    • 当函数作为对象的方法调用时,this 指向调用该方法的对象。
  3. 构造函数中的 this

    • 在构造函数中,this 指向正在创建的实例对象。
  4. 使用 call()apply()bind() 显式设置 this

    • call() 和 apply() 方法可以用来在调用函数时显式地设置 this 的值。它们的第一个参数就是要设置的 this 的值。
    • bind() 方法会创建一个新的函数,并把 this 绑定到指定的值,而不会立即执行函数。
  5. 箭头函数中的 this

    • 箭头函数的 this 指向它所在的词法作用域中的 this,而不是动态绑定。
  6. 事件处理函数中的 this

    • 在事件处理函数中,this 通常指向触发事件的 DOM 元素。
  7. DOM 中的 this

    • 在 DOM 事件处理函数中,this 通常指向触发事件的 DOM 元素。

了解 this 的行为是 JavaScript 中的一项重要技能,因为它决定了代码的行为和上下文。

转载自:https://juejin.cn/post/7366939722872946714
评论
请登录