Javascript:创建持久绑定函数

2023-12-01

我意识到这样的问题经常被问到(在过去的几天里我可能已经阅读了其中的每一个问题,试图了解如何解决这个问题) - 但在这种情况下,虽然我相当有信心,但我知道这是为什么发生这种情况,我正在努力实施实际的解决方案。

我正在使用 Node.js 构建一个小型应用程序,但在创建带有原型函数的对象时遇到了麻烦,而原型函数在传递时不会丢失绑定。

这是我到目前为止所拥有的:

foo.js

var Foo = module.exports = function(server) {
    this.server = server;
    // some other stuff
};

Foo.prototype.send = function(data) {
    server.doStuff(data);
};

Foo.prototype.sendData = function(data) {
    // do stuff with data;
    this.send(data);
};

bar.js

var Bar = module.exports = function() {
    this.dataStore = // data store connection;
};

Bar.prototype.getSomething(data, callback) {
    this.dataStore.get(data, function(err, response) {
        callback(response);
    });
};

main.js

var Foo = require('./foo');
var Bar = require('./bar');
var aFoo = new Foo(server);
var aBar = new Bar();

// at some point do:
aBar.getSomething(data, aFoo.sendData);

正如您可能想象的那样,传递 aFoo.sendData 函数用作回调会导致它失去与 aFoo 的绑定,因此它无法在 Foo 上找到“发送”函数。

我将如何修改 Foo 以便 sendData 保持其与 Foo 的绑定?是否有更好的方法来构造此代码,以便不需要这样做?


您只需将对 aFoo.sendData 的调用包装在匿名函数中:

aBar.getSomething(data, function () {
    aFoo.sendData();
});

因为你的引用aFoo.sendData,参考this inside sendData不再是aFoo。使用匿名函数时,您不是在引用该函数;而是在引用该函数。您只需将其作为方法调用aFoo实例,所以this仍然是aFoo.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript:创建持久绑定函数 的相关文章

随机推荐

  • circular_buffer 和 Managed_mapped_file 分段错误

    我正在使用 boost 1 73 0 并尝试将circular buffer 与manage mapped file 一起使用以将字符串存储在磁盘上持久存在的循环缓冲区中 我执行以下操作来创建 打开circular buffer boost
  • 如何找到不同 numpy 数组中两点之间的距离?

    这是针对 K 均值算法的 这是为了家庭作业 所以我不想使用 内置 Kmeans 函数 我有 2 个 numpy 数组 一种是质心 另一个是数据点 我试图找到从每个质心到每个数据点的距离 我不知道如何将数组传递给我的函数以使其打印 我想结束
  • JavaScript 中的保留字列表

    有没有比这个更完整的列表莫斯拉的关于保留字 它缺少像这样的词解析浮点型 toString 原型 etc parseFloat toString and prototype are not保留字 仅仅因为它们有时具有特殊含义 并不意味着您不能
  • 使用 Pandas 与 DataFrame 合并时出现 ValueError

    我正在尝试使用 Pandas 合并三个 DataFrame 为什么我会收到此错误消息 ValueError DataFrame 的真值不明确 使用 a empty a bool a item a any 或 a all 这是代码 df pd
  • 如何在给定(一条线上的两个点)和(从第三点到第一点的距离)的情况下找到第三点

    给定 一条线上的两个点 和 第三点到第一点的距离 如何找到第三点 语言 Visual Basic 2012 第三点与第二点在同一条线上 并且可能更接近第一点 也可能更接近第二点 这是一个可以处理两者 来自数据数组 的函数 奇怪的是 我似乎无
  • SQL 从一张表的字段更新另一张表的字段

    我有两张桌子 A ID column1 column2 column3 B ID column1 column2 column3 column4 A将永远是子集B 意味着所有列A也在B 我想用特定的内容更新记录ID in B他们的数据来自A
  • 如何在页面加载时使用 Javascript 发出成功的 Ajax 请求

    我正在开发一个购物车应用程序 用户将向其存储在本地存储中的 购物车 添加商品 当用户导航到将商品添加到购物车的不同页面时 需要使用他们添加到购物车 本地存储 的商品填充该页面 我使用 Handbars 为我的页面构建模板 使用 NodeJS
  • Python从xml树中删除重复元素

    我有一个 xml 结构 其中一些元素不是唯一的 因此 我设法对子树进行排序 并且可以正确过滤我拥有多次的元素 但删除功能似乎不适用 我的 XML 结构看起来像这样简化
  • 使用 Terraform 更改 hash_key 会导致表已存在错误

    我有一个使用此 Terraform 创建的 DynamoDB 表 resource aws dynamodb table materials table name materials hash key MATERIAL billing mo
  • 在 Web.Config 中设置 ServiceStack Cookie 域会导致会话 ID 在每次请求时发生更改

    As per ServiceStack 域和子域的身份验证 我在 httpCookies 部分中设置了 cookie 域 它实际上有效 它正确设置了 cookie 的域 但我注意到 一旦我将此行添加到配置中 每个请求都会生成一个新的会话 I
  • 在 setup.py 中指定私有 git 存储库的版本

    如何在 setup py 文件中指定私有存储库的版本 以便仅使用此版本 from setuptools import setup find packages setup name my module version 1 0 4 instal
  • jQuery ajax,等到 beforeSend 动画完成

    HTML 和 CSS a href link a img src http 2 bp blogspot com OIHTbzY7a8I TOaiTKLqszI AAAAAAAAAHM eb3iiOqxzKg s640 Auto Audi A
  • 将对象分割成块

    我有一个对象 var object 232510350 672 232510352 672 232510353 672 232510356 672 232510358 672 232510359 672 232510360 672 我想将它
  • Python IndexError:列表索引超出范围。无法通过索引访问

    我在用pySerial读取TTL字节流 读取两个字节 CheckSumByte b for b in ser read 2 print CheckSumByte print type CheckSumByte print str len C
  • 当鼠标悬停在 tkinter 单选按钮上时,它会被选中[重复]

    这个问题在这里已经有答案了 我在 tkinter 中使用 Radiobuttons 我可以很好地选择它们 但是当鼠标悬停在其中一个选项上时 它会被选中 而无需我实际单击鼠标左键 我已经考虑过将单选按钮的状态更改为禁用 但显然我将无法选择禁用
  • JQuery 1.3.2 vsdoc 不生成 Visual Studio 智能感知

    过去我使用过 JQuery 1 2 vsdoc 文件 它为 vs2008 sp1 生成智能感知 我最近下载了最新版本的 JQuery 1 3 2 和 JQuery 1 3 2 vsdoc 文件 当我尝试在 vs2008 中获取 jquery
  • Bash 命令作为变量

    我试图将 sed 命令的开头存储在变量中 如下所示 sedcmd sed i 后来我执行这样的命令 sedcmd s orig pkg package name g f 但这不起作用 使用 bash x 运行脚本 我可以看到它正在扩展 如下
  • 如何在 MVC 中保持滚动位置?

    我正在开发一个 MVC 项目 并且很喜欢学习它 虽然有一些成长的烦恼 但一旦你解决了它们 那就不错了 在 WebForms 世界中非常简单的一件事是维护页面上的滚动位置 您要做的就是将MaintainScrollPositionOnPost
  • 无法对深度学习图像执行 sudo

    我安装了最新的 Google Cloud深度学习虚拟机今天的图片 VM启动后 我能够做到sudo i通过 SSH 网络成功 登录后 我开始在后台运行 Tensorflow 模型训练 使用 几个小时后我无法以 root 身份登录 我收到以下消
  • Javascript:创建持久绑定函数

    我意识到这样的问题经常被问到 在过去的几天里我可能已经阅读了其中的每一个问题 试图了解如何解决这个问题 但在这种情况下 虽然我相当有信心 但我知道这是为什么发生这种情况 我正在努力实施实际的解决方案 我正在使用 Node js 构建一个小型