使用 ES11 新特性可靠地选择 JavaScript 的 “this” 指针

前言

在 JavaScript 的代码中,this 关键字很容易导致一些问题,因为它不总是指向你希望它指向的那个对象。

理解 this 的指向是尤其复杂的,尤其是当你将函数作为参数传递到另一个函数中,或者使用箭头函数时。

但是,ES11 引入了一个新的功能,可以使我们更可靠地控制 this 的指针,这个新功能就是“可选的成员调用操作符”。

在本文中,我们将介绍当 this 变得棘手时如何使用这个新功能来更好地控制它。

什么是 this

在 JavaScript 中,this 关键字指向当前函数的作用域。这意味着它可能是全局对象(如果在全局作用域中使用),也可能是调用该函数的对象。

但在某些情况下,这个指向可能会出现问题。例如,当您将函数作为参数传递给另一个函数时,新的函数将创建自己的作用域,而 this 指向也会随之改变。

什么是可选的成员调用操作符?

ES11 引入了可选成员调用操作符,这是一个新的语法,它使我们能够在不确定一个对象是否存在的情况下,使用它的属性或者方法。

----- --- - -
  ---- -
    ---- -
      ---- ---
    --
  --
--

-------------------------------- -- --

在上面的示例中,我们将 obj 对象中的 foo.bar.baz 输出到控制台。但是,如果对象的结构发生了变化,例如移除了 foo 对象,那么访问 obj.foo.bar.baz 将会报错。

我们可以使用可选成员操作符 ? 来解决这个问题。当 obj.foo 不是一个对象时,会返回 undefined,而不是一个错误。

不支持可选成员调用操作符的旧浏览器将会抛出一个语法错误,可以通过 babel 转换来解决这个问题。

如何使用可选的成员调用操作符来控制 this

在 JavaScript 中,this 关键字指向调用它的函数的作用域,而不是函数的定义作用域。这意味着,在以下情况下,可能会出现问题:

----- --- - -
  --- ---
  ---- -------- -- -
    ---------------------
  --
--

----- --- - -
  --- --
--

----- --- - --------

------ -- ---------
------- - --------
---------- -- -

在上面的示例中,我们定义了一个带有 foo 方法的 obj 对象,该方法引用了 this.id。我们还定义了另一个具有 id 属性的 bar 对象,并将 obj.foo 方法分配给 bar 对象的 foo 属性。

当我们将 obj.foo 赋值给 foo 变量时,this 的指向丢失了 id,因为 foo 函数的调用方式已经与 obj 对象分离了。

同样的,当我们将 obj.foo 分配给 bar.foo 后,this 仍然指向了 bar 对象而不是 obj 对象。

这时,可选的成员调用操作符可以派上用场,例如:

----- --- - -
  --- ---
  ---- -------- -- -
    ----------------------
  --
--

----- --- - -
  --- --
--

----- --- - --------

------ -- ---------
------- - --------
---------- -- -

在上面的示例中,我们在 console.log() 中加入了 this?.,它表示如果 this 存在,则使用它的 id 属性。这样,即使在 foo() 调用与 obj 对象分离的情况下,我们也可以在 console.log() 中访问 id 属性。

同样的,当我们将 obj.foo 分配给 bar.foo 后,this 仍然指向了 bar 对象而不是 obj 对象。

结论

在本文中,我们介绍了 this 关键字和可选的成员调用操作符,以及它们如何共同解决 JavaScript 中 this 关键字问题的一些方面。

我们发现,使用可选的成员操作符可以让我们更可靠地控制 this 的指向。这个功能对于将函数作为参数传递给另一个函数或使用箭头函数时特别有用。

我们希望本文能够帮助您更好地理解 this 指针,以及如何在代码中可靠地选择它。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66f2516fa44b36ee57657193


猜你喜欢

  • Serverless 的重要性及其在云计算中的应用

    Serverless 是一种新型的云计算架构,它的出现将极大地改变传统云计算的模式,避免了资源浪费,节省了成本,提高了开发效率和部署速度。本文将详细介绍 Serverless 的概念,重要性以及在云计...

    2 个月前
  • 如何为 Tailwind 框架增加自定义响应式类

    在前端开发中,响应式设计是必不可少的。Tailwind 框架通过提供一组预定义的类,使得响应式设计非常方便。然而,在某些情况下,我们可能需要自定义一些响应式类。本文将介绍如何为 Tailwind 框架...

    2 个月前
  • 使用 RxJS 处理 Ajax 请求

    引言 在 Web 应用中,经常需要发送 Ajax 请求获取数据。随着应用变得更加复杂,我们需要更好的方式来管理和处理这些请求,以确保应用的可靠性和用户体验。 RxJS 是一个强大的响应式编程库,可以帮...

    2 个月前
  • 如何解决 Mocha 和 Chai 测试框架在浏览器中运行错误

    Mocha 和 Chai 是常用的前端测试框架,但有时会在浏览器中运行错误。这篇文章将介绍如何解决问题并提供示例代码。 常见问题 在使用 Mocha 和 Chai 进行测试时,常见的问题有: Unc...

    2 个月前
  • Kubernetes 运维实践

    介绍 Kubernetes 作为一款容器编排平台,具有高可靠性、高可扩展性和自动化部署等优点,因此被广泛应用于企业级应用的容器化部署。但是,Kubernetes 的配置和管理也是一项需要耐心和技巧的工...

    2 个月前
  • 深入理解 Promise 内部机制,探究异步编程本质

    前端开发中,异步编程是非常重要的技术之一。而 Promise 作为这个技术的重要表现形式,被广泛应用。本文将深入解析 Promise 的内部机制,探究异步编程的本质,并提供一些实例代码。

    2 个月前
  • 在 ES7 中使用 Promise.prototype.finally() 处理 finally 块

    在 JavaScript 中,Promise 是一种用于异步编程的语言特性,它允许开发人员编写可重用的、可组合的、可链式调用的操作。Promise 建立在回调地狱的思想之上,可以让开发人员更好地管理异...

    2 个月前
  • 如何在 Deno 中实现自定义异常处理

    在 Deno 中,异常处理是一个非常重要的概念。一个好的异常处理方案可以让我们更容易地调试和维护代码。在本文中,我们将探讨如何在 Deno 中实现自定义异常处理。 什么是异常处理? 在编程中,我们可能...

    2 个月前
  • GraphQL 如何实现数据缓存以提高性能

    引言 在 Web 前端开发中,随着前端应用的不断发展与复杂程度的增加,数据处理的效率以及性能问题越发变得突出,如何处理数据取决于前端应用的架构、网络条件以及服务器的性能等等因素。

    2 个月前
  • 如何针对 Retina 屏幕进行响应式设计优化

    随着移动设备和电脑屏幕的更新换代,越来越多的设备采用 Retina 屏幕,这种高像素密度的屏幕让我们的网页设计变得更加清晰,但同时也带来了一些挑战。在本文中,我们将详细介绍如何针对 Retina 屏幕...

    2 个月前
  • PM2 教程:Node.js 进程管理的利器

    什么是 PM2? PM2 是一个用于管理 Node.js 进程的工具,它可以用于启动、停止、重启、监视 Node.js 应用程序。 Node.js 是一个非常流行的 Web 开发技术,在实际的开发过程...

    2 个月前
  • Serverless 的开发流程

    随着云计算和微服务的普及,Serverless 服务成为了前端开发者和企业建立 Web 应用的热门选择。Serverless 框架可以快速构建可扩展的应用程序,同时对于大多数应用程序来说,无服务器应用...

    2 个月前
  • 解决使用 Jest 测试框架时遇到的 React 组件渲染问题

    前言 在 React 开发中,我们经常需要使用 Jest 这种测试框架来进行单元测试和集成测试。但是,在使用 Jest 进行 React 组件测试时,我们有时会遇到组件渲染的问题,本文将讲解如何解决这...

    2 个月前
  • 借助 Web Components 打造高可用的组件应用

    随着前端技术的不断发展,很多网页应用都倾向于使用组件化的架构来开发,以提高重用性和维护性。Web Components 技术就是其中的一种实现方式,它可以帮助我们构建更加高可用的组件。

    2 个月前
  • 升级 Headless CMS 的正确姿势

    什么是 Headless CMS? Headless CMS是一种将内容管理系统(CMS)从前端界面解耦的CMS设计,故称“无头”CMS。Headless CMS 允许前端开发人员使用 API 访问后...

    2 个月前
  • 如何优化 RESTful API 的数据库操作性能

    在现代 Web 开发中,将应用分成前端和后端部分已经成为了普遍实践。由于前后端通讯的重要性,RESTful API 已成为了 Web 开发中应用最广泛的设计模式之一。

    2 个月前
  • 在 WordPress 中性能优化 MySQL 数据库

    在 WordPress 中性能优化 MySQL 数据库 数据库是所有网站的基本元素之一,对于 WordPress 站点而言也不例外。WordPress 的核心是构建在 MySQL 数据库之上的,因此数...

    2 个月前
  • 用 HapiJS 和 JWT 快速搭建自己的用户认证系统

    现代 Web 应用程序中,用户认证系统是必不可少的一部分。在此,我们将介绍如何使用 HapiJS 和 JWT 来快速构建一个自己的用户认证系统。 什么是 HapiJS? HapiJS 是一个 Node...

    2 个月前
  • 让 Node.js 进程管理更好用的 PM2

    当我们运行 Node.js 服务器时,我们可能需要同时处理多个进程、日志管理、进程守护等多个问题。PM2 是一个流行的 Node.js 进程管理工具,可以极大地简化这些问题。

    2 个月前
  • 实用无障碍设计:从用户角度出发

    无障碍设计指的是在设计网站或应用程序时,考虑到所有用户的需求和使用情况,包括身体残疾、年龄、文化背景和技能水平等方面的差异,让所有人都能够完全使用和理解内容。在前端开发中,无障碍设计已经逐渐成为注意的...

    2 个月前

相关推荐

    暂无文章