深入浅出理解JavaScript中的this

本文部分摘自《你不知道的JavaScript(上)》

深入浅出理解JavaScript中的this指向

全文将从以下四个方面阐述JS中this的指向问题且全文将按照“声明概念->给出代码->解释说明”的方式阐述this指向问题。希望本文能够帮助您更深一步地理解this指向问题。

  • 默认绑定
  • 隐式绑定
  • 显式绑定
  • new 操作符
1.默认绑定

    在讨论这个问题之前,我们先要搞明白两个概念:调用位置和调用栈。
    调用位置:从字面意思来看,就是函数被调用的位置,事实上也就是如此,只不过需要注意好声明位置和调用位置不是一回事即可。
    调用栈:我们大可将它理解为“为了到达当前执行位置所调用的所有函数。”


    弄明白上述概念后,我们即可来说什么叫默认绑定,默认绑定即为:在调用函数时,使用任何不带任何修饰的函数引用进行调用的,都会触发默认绑定,即将this 指向 window。这句话理解起来似乎是那么抽象,简而言之就是当你直接使用函数名称调用时,就会触发默认绑定。
    下面以代码为例解释:

在这里插入图片描述
    在这里需要强调的是,尽管foo是baz调用的,那么为什么foo打印的this还是指向window呢?根据上面我们所说的,只要是使用函数名称直接调用的,甭管怎么样,this就是指向window.
    此外我们需要注意ES5的严格模式
    当函数运行严格模式下,this将不再指向window,而是指向undefined.

在这里插入图片描述
    仅仅当函数运行在严格模式下,this的默认绑定会受影响,在严格模式中调用函数并不会影响this的指向。

在这里插入图片描述

2.隐式绑定

    何为隐式绑定,即当调用函数时不是直接使用函数名称直接调用且当前有执行期上下文对象的,将会触发隐式绑定,this将指向这个执行期上下文对象。
    下面以代码为例进行解释:

在这里插入图片描述
   无论对象里面的函数是直接在Obj里面定义的还是在外面定义而后在Obj里面引用,严格来说,这个函数都不属于Obj对象。
   这样调用会使用Obj的上下文来引用函数,因此this指向Obj的上下文,此时的this.a == obj.a。
   当函数引用有上下文对象时,隐式绑定规则会把函数调用中的 this 绑定到 这个上下文对象身上。

2.1链式调用

   值得注意的是,假如出现了链式调用( obj1.obj2.obj3.foo() ),那么foo的this将指向obj1还是obj2亦还是obj3。我们不妨写一个例子来测试一下:

在这里插入图片描述
    由此得知,当出现链式调用时,只有最后一层或上一层的上下文对象才是this绑定的。

2.2隐式丢失

    所谓隐式丢失从字面意思上来看就是偷偷的丢了。那么到底是什么意思呢?隐式丢失指的是在运行过程中,因为一些隐式的操作,影响了this的指向,本来我们想将this指向A,因为一些隐式操作,this却指向了B,这就叫作隐式丢失。
    我们来看下面一个小例子:

在这里插入图片描述
    按照常理foo将打印1,但实际上却打印了 window.scope,为什么会发生这种情况?我们来分析一下。首先定义了一个函数foo,接着定义了一个obj,然后在全局声明了一个变量a,接着把obj.foo的引用赋给了 bar,引用?对,就是这里出现了问题。当我们把obj.foo的引用赋给bar时,此时bar是函数foo的引用,当我们使用bar()进行调用时,这里是直接使用函数名称进行调用的,因此会触发默认绑定,即this将指向window。因此我们打印this.a实际上是打印了window.a。

    明白了这个,下面解释在函数回调过程中也会发生隐式丢失就不困难了,来看下面一段代码:
在这里插入图片描述

3.显式绑定

显式绑定就是我们需要了解的两个方法:

  • call
  • apply

如果我们需要显式的指定this的指向,我们使用这两个方法就行了,这里不再对call和apply展开叙述,只给出一个小例子,后续会再写一篇针对call和apply的文章。
在这里插入图片描述

尽管call和apply能够显示指定this的指向,但是仍然无法解决我们刚才遇到的隐式丢失问题,在此我们着重讨论一下硬绑定(解决隐式丢失问题)

硬绑定从名字来看我们就知道什么意思了,把this死死的绑定到我们需要绑定的地方上。
硬绑定总共有4种方法,我们只捡其中的2种来讨论,让我们来看下面代码:

在这里插入图片描述
在这里插入图片描述
至于为什么不直接使用 foo.call/foo.apply 方法,反而又去定义一个bar去调用,我仍在思考中,如果您对此有好的理解并且您愿意分享的话,劳烦您在评论区留下您的宝贵理解!

4.new 构造函数

在JS中实际上不存在构造函数,只存在对于函数的“构造调用”,并无什么构造函数,只不过是通过new调用了一个普通函数而已,我们来讨论一下在 new 调用的过程中,与this有关的是什么。

在这里插入图片描述


到此,本篇关于this的理解到此结束,文章或有些许不足,但还是希望能够帮助到您。谢谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值