目录
“这个”关键字
什么叫回调?
使用“self”模式
示例
'this' Inside a Callback using the 'self' pattern
使用箭头函数
'this' Inside a Callback using the arrow function
使用另一个变量来存储“this”对象
使用显式地将 this 绑定到对象
首页 web前端 js教程 如何在回调中访问正确的'this”?

如何在回调中访问正确的'this”?

Aug 24, 2023 am 09:53 AM

如何在回调中访问正确的this”?

在本教程中,我们将了解如何在回调中访问正确的“this”。

“这个”关键字

每个函数都包含一个名为 this 的关键字,也称为“上下文”,其值由函数的调用方式决定,而不是由函数的定义方式、时间或位置决定。与其他变量不同,它不受词法作用域的影响。与其他语言相比,当使用函数的“this”关键字时,JavaScript 的行为略有不同。在严格模式和非严格模式之间,还有一些进一步的变化。

函数最常被调用的方式决定了“this”的值(运行时绑定)。每次调用该函数时它都可能会发生变化,并且在执行时不能通过赋值来更改。函数被调用的次数,bind() 方法可以设置该值,因为箭头函数不提供自己的“this”绑定(它保留封闭词法上下文的“this”值)。

什么叫回调?

从另一个函数接收参数的函数称为回调,通常在稍后的外部函数中使用。高阶函数是一个术语,用于描述接受回调的外部函数。

回调有自己的一组方法和属性,因为函数是 JavaScript 中的对象。在高阶函数内执行时分配给回调的“this”属性完全取决于回调的制作方式,而不是定义的位置、方式或时间。

通过检查调用回调的高阶函数,我们可以确定回调中的“this”值。封闭函数的实际定义可能包括本地范围的属性,这是回调中 this 问题的主要原因。但是,由于回调的上下文根据其调用方式而动态变化,因此当通过回调中的“this”绑定访问该属性时,它不存在。

现在我们将学习在回调中访问正确的“this”的方法。

使用“self”模式

创建一个名为 self 的变量,并在声明函数的范围内为其赋予 this 值是一种典型的模式。我们可以通过创建一个名为 self 的新变量(或任何其他有效的变量名称都可以)并为其赋予“this”值来实现所需的行为。

示例

<html>
<body>
   <h2 id="this-Inside-a-Callback-using-the-i-self-pattern-i"> 'this' Inside a Callback using the <i> 'self' pattern </i> </h2>
   <button onclick="myFunction()"> Click here </button>
   <div id="root" style="
      background-color: rgb(240, 248, 255);
      border: 1px solid gray;
      margin: 5px 0px;
      padding: 10px;
   ">
      Welcome to Tutorialspoint!
   </div>
   <script>
      const root = document.getElementById('root')
      function myFunction() {
         this.variable = 'I am this variable'
         const variable = 'I am a const variable'
         const self = this
         setTimeout(() => {
            root.innerHTML = this.variable + '<br/>'
            root.innerHTML += variable
         }, 1000)
      }
   </script>
</body>
</html>
登录后复制

使用箭头函数

ECMAScript 6 见证了 JavaScript 箭头函数的首次亮相。它们没有自己的绑定,是传统函数表达式的更简洁的替代方案。这确保了如果在箭头函数内部引用 this,它会作为常规变量在范围内进行搜索。

示例

<html>
<body>
   <h2 id="this-Inside-a-Callback-using-the-i-arrow-function-i"> 'this' Inside a Callback using the <i> arrow function </i> </h2>
   <button onclick="myFunction('ABC')"> Click here </button>
   <div id="root" style="
      background-color: rgb(240, 248, 255);
      border: 1px solid gray;
      margin: 5px 0px;
      padding: 10px;
   ">
      Welcome to Tutorialspoint!
   </div>
   <script>
      const root = document.getElementById('root')
      function myFunction(name) {
         this.name = name
         let obj = {
            run: function(callback) {
               setTimeout(callback, 1000)
            },
         }
         obj.run(() => {
            root.innerHTML = this.name
         })
      }
   </script>
</body>
</html>
登录后复制

使用另一个变量来存储“this”对象

该对象链接到它,这通常是当我们尝试在回调中访问它时真正想要访问的对象。创建变量并在回调作用域之前存储其值是实现此目的的一种方法(尽管有些程序员不愿意这样做,因为它看起来很混乱)。

有些人将其称为“that”或“self”,但只要术语明确,就没有关系。此解决方法非常有效,因为该变量符合词法范围要求,因此可在回调中使用。您仍然可以访问回调的动态 this 绑定,这是这种方式的另一个好处。

示例

<html>
<body>
   <h2>
      'this' Inside a Callback using the
      <i> another variable to store the 'this' object </i>
   </h2>
   <button onclick="myFunction('XYZ')"> Click here </button>
   <div id="root" style="
      background-color: rgb(240, 248, 255);
      border: 1px solid gray;
      margin: 5px 0px;
      padding: 10px;
   ">
      Welcome to Tutorialspoint!
   </div>
   <script>
      const root = document.getElementById('root')
      function myFunction(name) {
         this.name = name
         let that = this
         let obj = {
            run: function(callback) {
               setTimeout(callback, 1000)
            },
         }
         obj.run(function() {
            root.innerHTML = this.name
         })
      }
   </script>
</body>
</html>
登录后复制

使用显式地将 this 绑定到对象

当我们定义回调时,我们可以声明我们想要什么。我们可以使用bind()方法设置“this”值,并确保它在整个函数执行过程中保持这种状态,无论它是如何或在哪里调用或传递的。

bind() 方法在每个函数中都可用,并使用连接到给定对象的“this”属性创建一个新函数。返回函数和原始函数之间的唯一区别是您可以完全控制“this”属性指向的内容。

示例

<html>
<body>
   <h2>
      'this' Inside a Callback using
      <i> explicitly binding this to an object </i>
   </h2>
   <button onclick="myFunction('Tutorialspoint')"> Click here </button>
   <div id="root" style="
      background-color: rgb(240, 248, 255);
      border: 1px solid gray;
      margin: 5px 0px;
      padding: 10px;
   ">
      Welcome to Tutorialspoint!
   </div>
   <script>
      const root = document.getElementById('root')
      function myFunction(name) {
         this.name = name
         let callbackFunction = function() {
            root.innerHTML = this.name
         }.bind(this)
         let obj = {
            run: function(callbackFunction) {
               setTimeout(callbackFunction, 1000)
            },
         }
         obj.run(callbackFunction)
      }
   </script>
</body>
</html>
登录后复制

以上是如何在回调中访问正确的'this”?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

console.log输出结果差异:两次调用为何不同? console.log输出结果差异:两次调用为何不同? Apr 04, 2025 pm 05:12 PM

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...

前端开发中如何实现类似 VSCode 的面板拖拽调整功能? 前端开发中如何实现类似 VSCode 的面板拖拽调整功能? Apr 04, 2025 pm 02:06 PM

探索前端中类似VSCode的面板拖拽调整功能的实现在前端开发中,如何实现类似于VSCode...

See all articles