深入浅出理解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
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言用于封装代码的单元,可以实现代码的复用和模块化。C语言定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言用于存储同类型数据的结构,可以通过索引访问和修改数组的元素。字符串是C语言用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言用于封装代码的单元,可以实现代码的复用和模块化。C语言定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言用于存储同类型数据的结构,可以通过索引访问和修改数组的元素。字符串是C语言用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值