”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么“this”不引用 JavaScript 回调中的调用函数?

为什么“this”不引用 JavaScript 回调中的调用函数?

发布于2024-11-24
浏览:891

Why Doesn\'t \'this\' Refer to the Calling Function in JavaScript Callbacks?

当 this 争论时:理解回调函数中的 'this'

在 JavaScript 中,函数调用中 this 的值由执行该函数的上下文。然而,当将 this 作为参数传递时,规则可能会变得复杂。

具体来说,会出现以下情况:当回调函数作为参数传递时,为什么不将 this 设置为调用的函数回调?

理解 'this' 的层次结构

要理解为什么 this 被设置在它所在的位置,我们需要考虑函数调用的层次结构:

  • obj.prepareRandomFunction() 将 this 设置为 obj (答案中的规则#2)。
  • randomFunction(this.sumData.bind(this))将 this.sumData.bind(this) 作为参数传递(规则 #1)。
  • 在 randomFunction 中,callback(data) 设置 this到全局对象(规则#1)。

但是,在 randomFunction 调用回调之前,它使用 this.sumData.bind(this) 创建一个新函数(规则#5)。这个新函数调用原始回调函数,但现在将 this 绑定到 obj(传递给 bind 的参数)。

回调函数的含义

传递方法时作为回调,了解它不会被称为 obj.method() 至关重要。这意味着 this 在回调函数中不会有正确的值。要解决此问题,您可以使用 bind() 在回调中设置 this 的值。

其他有用注释

  • 中的规则 #6答案描述了 ES6 箭头函数如何维护 this 的当前词法值,即使在回调函数中也是如此。
  • .apply() 和 .call() 可用于创建新的具有特定 this 值的函数调用。
  • bind() 可用于创建新函数,该新函数使用自定义的 this 值调用原始函数。
  • 了解 this 的复杂本质至关重要用于有效的 JavaScript 编码和掌握回调等概念。
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3