广告
返回顶部
首页 > 资讯 > 精选 >JavaScript中this指向问题的示例分析
  • 716
分享到

JavaScript中this指向问题的示例分析

2023-06-14 13:06:19 716人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关javascript中this指向问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 箭头函数箭头函数排在第一个是因为它的 this 不会被改变,所以只要当前函数

这篇文章将为大家详细讲解有关javascript中this指向问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1. 箭头函数

箭头函数排在第一个是因为它的 this 不会被改变,所以只要当前函数是箭头函数,那么就不用再看其他规则了。

箭头函数的 this 是在创建它时外层 this 的指向。这里的重点有两个:

  1. 创建箭头函数时,就已经确定了它的 this 指向。

  2. 箭头函数内的 this 指向外层的 this。

所以要知道箭头函数的 this 就得先知道外层 this 的指向,需要继续在外层应用七步口诀。

2. new

当使用 new 关键字调用函数时,函数中的 this 一定是 js 创建的新对象。

读者可能会有疑问,“如果使用 new 关键调用箭头函数,是不是箭头函数的 this 就会被修改呢?”。

我们在控制台试一下。

func = () => {}new func() // throw error

从控制台中可以看出,箭头函数不能当做构造函数,所以不能与 new 一起执行。

3. bind

bind 是指 Function.prototype.bind() 。

多次 bind 时只认第一次 bind 的值

易错点

function func() {  console.log(this)}func.bind(1).bind(2)() // 1

箭头函数中 this 不会被修改


bind 与 new

易错点

function func() {  console.log(this, this.__proto__ === func.prototype)}boundFunc = func.bind(1)new boundFunc() // Object true,口诀 2 优先

4. apply 和 call

apply() 和 call() 的第一个参数都是 this,区别在于通过 apply 调用时实参是放到数组中的,而通过 call 调用时实参是逗号分隔的。

箭头函数中 this 不会被修改

易错点

func = () => {  // 这里 this 指向取决于外层 this,参考口诀 7 「不在函数里」  console.log(this)}func.apply(1) // Window,口诀 1 优先

bind 函数中 this 不会被修改

易错点

function func() {  console.log(this)}boundFunc = func.bind(1)boundFunc.apply(2) // 1,口诀 3 优先

5. 欧比届点(obj.)

function func() {  console.log(this.x)}obj = { x: 1 }obj.func = funcobj.func() // 1

这里就不用代码例证箭头函数和 bind 函数的优先级更高了,有兴趣可自行尝试吧。

6. 直接调用

在函数不满足前面的场景,被直接调用时,this 将指向全局对象。在浏览器环境中全局对象是 Window,在 node.js 环境中是 Global。

先来个简单的例子。

function func() {  console.log(this)}func() // Window

来一个复杂的例子,外层的 outerFunc 就起个迷惑目的。

function outerFunc() {  console.log(this) // { x: 1 }  function func() {    console.log(this) // Window  }  func()}outerFunc.bind({ x: 1 })()

7. 不在函数里

不在函数中的场景,可分为浏览器的 <script /> 标签里,或 node.js 的模块文件里。

  1. 在 <script /> 标签里,this 指向 Window。

  2. 在 Node.js 的模块文件里,this 指向 Module 的默认导出对象,也就是 module.exports。

非严格模式

严格模式是在 ES5 提出的。在 ES5 规范之前,也就是非严格模式下,this 不能是 undefined 或 null。所以**在非严格模式下,通过上面七步口诀,如果得出 this 指向是 undefined 或 null,那么 this 会指向全局对象。**在浏览器环境中全局对象是 Window,在 Node.js 环境中是 Global。

例如下面的代码,在非严格模式下,this 都指向全局对象。

function a() {  console.log("function a:", this)  ;(() => {    console.log("arrow function: ", this)  })()}a()a.bind(null)()a.bind(undefined)()a.bind().bind(2)()a.apply()

非严格模式下执行结果为:

JavaScript中this指向问题的示例分析

在严格模式下,执行同样的代码进行对比。记住要一次性将所有代码复制粘贴到控制台中,才能运行在严格模式下(因为第一行 "use strict" 才会对后面的代码生效)。

"use strict"function a() {  console.log("function a:", this)  ;(() => {    console.log("arrow function: ", this)  })()}a()a.bind(null)()a.bind(undefined)()a.bind().bind(2)()a.apply()

严格模式下执行结果为:

JavaScript中this指向问题的示例分析

七步口诀在严格模式下和非严格模式下都是完备的,只是在非严格模式下 null 或 undefined 会被转换为全局对象。所以我没有将这点列入口诀中。

做题复习

先背诵口诀再做题,“箭头函数、new、bind、apply 和 call、欧比届点(obj.)、直接调用、不在函数里”。

1. 下面代码执行后,func.count 值为多少?

function func(num) {  this.count++}func.count = 0func(1)

答案

func.count 值为 0。

按照口诀,func() 调用时属于第 6 类「直接调用」。在非严格模式下,this 指向全局对象。this 跟 func 一点关系都没有,所以 func.count 保持不变。so easy。

2. 以下箭头函数中 this 指向谁呢?

obj = {  func() {    const arrowFunc = () => {      console.log(this._name)    }    return arrowFunc  },  _name: "obj",}obj.func()()func = obj.funcfunc()()obj.func.bind({ _name: "newObj" })()()obj.func.bind()()()obj.func.bind({ _name: "bindObj" }).apply({ _name: "applyObj" })()

答案

// obj
// undefined
// newObj
// undefined
// bindObj

关于“JavaScript中this指向问题的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: JavaScript中this指向问题的示例分析

本文链接: https://www.lsjlt.com/news/271158.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中this指向问题的示例分析
    这篇文章将为大家详细讲解有关JavaScript中this指向问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 箭头函数箭头函数排在第一个是因为它的 this 不会被改变,所以只要当前函数...
    99+
    2023-06-14
  • Javascript中this关键字指向问题的示例分析
    这篇文章主要介绍了Javascript中this关键字指向问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。测试题目第一题<...
    99+
    2022-10-19
  • JavaScript中this指向的示例分析
    小编给大家分享一下JavaScript中this指向的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!this先看代码:方法中function t...
    99+
    2023-06-25
  • js中this的指向问题归纳的示例分析
    这篇文章给大家分享的是有关js中this的指向问题归纳的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。thisthis:上下文,会根据执行环境变化而发生指向的改变.1.单...
    99+
    2022-10-19
  • Angular.JS中this指向的示例分析
    这篇文章主要介绍了Angular.JS中this指向的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。【this详解】1、谁最终调用函...
    99+
    2022-10-19
  • JavaScript之this指向实例分析
    今天小编给大家分享一下JavaScript之this指向实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。默认绑定,全局...
    99+
    2023-06-30
  • JavaScript 中this指向问题案例详解
    总结 全局环境 ➡️ window 普通函数 ➡️ window 或 undefined 构造函数 ...
    99+
    2022-11-12
  • JavaScript面向对象基础与this指向的示例分析
    这篇文章给大家分享的是有关JavaScript面向对象基础与this指向的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 、OOP的基础问题1.1什么是面向过程和面向对...
    99+
    2022-10-19
  • JavaScript中this指向方法实例分析
    这篇文章主要讲解了“JavaScript中this指向方法实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中this指向方法实例分...
    99+
    2022-10-19
  • JavaScript中的this关键词指向实例分析
    这篇文章主要讲解了“JavaScript中的this关键词指向实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中的this关键词指向实例分析”吧!1、es5中的th...
    99+
    2023-06-30
  • JavaScript中的this指向问题详解
    前言 相信我,只要记住本文的 7️⃣ 步口诀,就能彻底掌握 JS 中的 this 指向。 先念口诀:箭头函数、new、bind、apply 和 call、欧...
    99+
    2022-11-12
  • Vue中关于this指向的问题示例详解
    目录由Vue管理的函数不被vue管理的函数this指向大致分类总结在Vue中,方法体里用this调用vue实例的数据,有时会指向window,导致调用失败报错。 由Vue管理的函数 ...
    99+
    2022-11-13
  • JQuery中this的指向实例分析
    这篇文章主要介绍“JQuery中this的指向实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JQuery中this的指向实例分析”文章能帮助大家解决问题。JavaScript中的this不总...
    99+
    2023-06-30
  • javascript中 “this”的示例分析
    小编给大家分享一下javascript中 “this”的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言:我们知道...
    99+
    2022-10-19
  • Vue中methods的this指向问题浅析
    如果是组件的话,将会是VueComponent实例对象,Vue和VueComponent两个类其实差不都,今后会另外开章节描述两者差别,这里先飘过。 比如下面的简单的一个demo代码...
    99+
    2022-11-13
    Vue methods Vue methods this指向
  • 一文搞懂JavaScript中的this指向问题
    一、全局环境下的this指向在全局作用域下,this始终指向全局对象window,无论是否是严格模式!congsole.log()完整的写法是window.console.log(),window可以省略,window调用了console....
    99+
    2023-05-14
    javascript
  • 一文详解JavaScript中this指向的问题
    目录1. 默认绑定2. 隐式绑定3. 显示绑定4. new 绑定5. 箭头函数的this6. 优先级7. 总结前提:文章讨论的都是非严格模式下this指向 1. 默认绑定 例子1 ...
    99+
    2023-05-14
    JavaScript this指向 JavaScript this
  • JavaScript中this指向的问题怎么解决
    今天小编给大家分享一下JavaScript中this指向的问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 默...
    99+
    2023-07-05
  • JavaScript中的this指向问题怎么解决
    这篇文章主要介绍了一文搞懂JavaScript中的this指向问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇一文搞懂JavaScript中的this指向问题文章都会有所收获,下面我们一起来看看吧。this的...
    99+
    2023-07-04
  • JavaScript中this指向问题怎么理解
    这篇文章主要介绍“JavaScript中this指向问题怎么理解”,在日常操作中,相信很多人在JavaScript中this指向问题怎么理解问题上存在疑惑,小编查阅了各式资料,...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作