javascript:从回调函数调用对象内部的函数

2023-12-08

当我尝试使用回调函数中的“this”调用对象内部的函数时,会发生错误,指出该方法未定义。 我该如何解决这个问题!

 var object_log = {
    user: "",
    pass: "",
    error_message: "an error occured while connecting",
    init: function(user, pass) {
        this.user = user;
        this.pass = pass;
    },
    login: function() {
        remote_submit(identify, this.success, this.error);
    },
    error: function() {
        alert(this.error_message);
    },
    success: function() {
        alert("success");
    }
};

您需要使用.call() or .apply()回调中的方法来指定调用该方法的上下文。

回调方法remote_submit不知道什么this将不再是这样,因此当它调用回调方法时,它们会像普通函数一样执行,而不是在对象上执行。

您可以通过将函数包装在出处来“绑定”函数:

var self = this;
remote_submit(
  identify,
  function() { return self.success.apply(self, arguments); },
  function() { return self.error.apply(self, arguments); }
);

这允许您在匿名函数的闭包中传递上下文并使用独占函数执行回调this语境。

看来在 EMCAScript5+ 中您可以使用bind在函数上绑定它以便在回调中使用:

remote_submit(identify, this.success.bind(), this.error.bind())

然而从MDN 文档:

绑定函数是 ECMA-262 第 5 版的最新新增内容;因此,它可能并不存在于所有浏览器中。您可以通过在脚本开头插入以下代码来部分解决此问题,从而允许在本机不支持它的实现中使用bind()的大部分功能。

垫片/填充材料在这里:

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}

Update:

为了回答您的附加问题,我们首先看一下call and apply文档并分解它们的工作原理:

从根本上来说,他们的工作原理是相同的,唯一的区别是他们如何看待他们的论点:

myfunc.call(target, param1, param2, param3);

将会通知myfunc(param1, param2, param3) with target as this.

var args = [param1, param2, param3];
myfunc.apply(target, args);

将会通知myfunc(param1, param2, param3) with target as this.

基本上区别在于.apply()接受一个参数数组,其中call函数要求您在代码中写入参数。

接下来,如果我们看一下我给你的例子:

function() { return self.success.apply(self, arguments); }

这将返回一个函数,该函数将通过传递所有参数来调用您的回调(arguments变量)被传递到匿名函数中,到apply功能。所以:

var a = function() { return self.success.apply(self, arguments); };
a(1,2,3,4);

这将调用self.success(1,2,3,4) with self as this。如果您想用特定的东西来增强论据,例如如果您想要a(1,2,3,4)打电话self.success(self.test, 1, 2, 3, 4)那么你必须向apply功能:

var a = function() {
  var args = [self.test];
  for(var i = 0; i < arguments.length; i++) args[] = arguments[i];
  return self.success.apply(self, args);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript:从回调函数调用对象内部的函数 的相关文章

  • 如何将函数处理程序从控制器传递到 AngularJs 中的指令隔离范围?

    我在控制器中有以下功能 angular module app controller BodyController function this click function message alert message 我想将此函数传递到指令的
  • 如何使用 Angular 1.5 中的组件为每个页面设置标题

    我最近开始使用 Angular 1 5 组件 我的应用程序中有多个页面 所以我决定创建一个
  • 嵌套 .ajax() 调用的 JavaScript/jQuery 变量作用域问题

    我很难传递变量postData这是一个嵌套子级的序列化 jQuery 数组对象 ajax call postData成功传递给第一个 ajax 打电话 但是当我尝试在第二次使用它时 ajax 调用时 它不会发布任何表单元素 因为变量在该级别
  • 如何获取Python对象父级?

    所以 我试图获取自定义对象 内部 的对象 这是一个例子 假设 o 是一个对象 无论是什么类型 它都可以存储变量 o Object class Test def init self self parent o This is where I
  • 如何使用 JavaScript 或 jQuery 清除 Google Chrome、Mozilla Firefox 和 Safari 中的剪贴板数据

    我正在开发一个网站 我想在使用 JavaScript 或 jQuery 查看我的网站时按下打印屏幕按钮时清除剪贴板数据 谁能帮我解决这个问题 我在 Internet Explorer 中成功处理了这个问题 提前致谢 由于安全原因 您无法使用
  • 由表达式文字生成的正则表达式是否共享单个实例?

    以下代码片段 来自 Crockford 的Javascript 好的部分 演示了由正则表达式文字创建的 RegExp 对象共享单个实例 function make a matcher return a gi var x make a mat
  • 如何从 github 安装需要构建步骤的 npm 包,例如什么时候分叉一个库?

    假设您使用类似的库vue3 datepicker https www npmjs com package vue3 datepicker 您意识到您需要自定义某些内容 并且作为第一步 您想要使用它的自定义分支 问题是 当包被推送到 npm
  • ES6 在defineAsyncComponent 中命名导入

    我想异步加载我的网络应用程序的一些元素 这是旧的导入 import Popover PopoverButton PopoverPanel from headlessui vue export default components Popov
  • 为什么此 Firebase 可调用函数不返回值?

    我有一个应返回值的可调用函数 但唯一返回的是 null 以下是该功能的当前版本 我也尝试过回报第一个承诺 原来的once调用 最后在另一个then返回 GUID 在这种情况下它实际上返回了数据 但它立即返回并且 GUID 为空 我怎样才能实
  • 移动设备上的剩余悬停效果

    我一整天都在努力做这个JSFiddle http jsfiddle net gsamaras q2w4jjyt 4 也适用于手机 但我所有的尝试都没有效果 在桌面上 当用户将鼠标悬停在箭头上时 它会变成红色 在移动设备上 当用户触摸 为了单
  • 对 UPDATE 行的 POST 请求

    我是 javascript 的新手 所以我正在寻找一些帮助来创建一种拖放地理编码标记的方法 以允许交互式更改地址 我相信通过更新 LOCATION 列行可以实现这一点 第一步是 发送 POST 请求 对吧 好吧 所以我想问是否有人可以给我看
  • 为什么使用 MarkForCheck() 和 setTimeout?

    我对 ChangeDetectorRef 中的 MarkForCheck 方法有疑问 对于一种用法我必须使用this cd markForCheck 因为在控制台中我获取了值 但它没有在视图上更新 setTimeout gt this ch
  • Opera Mobile 9.7 Beta 设置焦点 [重复]

    这个问题在这里已经有答案了 我们使用手持式扫描仪将物品移入和移出库存 扫描仪运行一个 ASP 页 该页提交表单以移动项目 我们最近购买了一台运行 Windows Mobile 6 1 的新扫描仪 很快就意识到 Mobile IE 完全没用
  • 以编程方式将子节点添加到 jstree

    我正在尝试编写一些动态添加节点到 jstree 的代码 我已经关注了医生http www jstree com documentation crrm http www jstree com documentation crrm但无法获得一个
  • 带数字键的 Immutable.js 映射(包括性能测试)

    我在 React Native 应用程序中将 Immutable js 与 Redux 结合使用 元数据 例如查找表 是从服务器获取的 并作为 Immutable Map 保存在应用程序本地 查找值的键是整数 数据库中的主键 当我获取数据时
  • Tizen SDK:找不到变量:tizen

    我正在尝试使用 Tizen SDK 创建一个 Web 应用程序 当我启动应用程序时 一切都很好 但是当我在模拟器上按 后退 按钮时 没有任何反应 并且我看到一条消息 55435 js main js 9 ReferenceError 找不到
  • iOS 上 Safari 中的 shift 键

    有没有办法在javascript中判断手机键盘上是否按下了shift键 并将其与大写锁定 按两次shift键 区分开来 一些事实 首先 让我们看一下有关 iOS 键盘的一些事实 我假设您已经知道了 当您进入键盘模式时 shift键始终处于激
  • 构造函数可以返回什么值来避免返回 this ?

    确切的情况是什么 returnJavascript 中的语句可以返回除this当使用构造函数调用时new关键词 Example function Foo return something var foo new Foo 如果我没记错的话 如
  • 阻止 Chrome 扩展程序的 popup.html 自动打开

    我正在创建一个 Chrome 扩展程序 其中包含background html每分钟从 API 请求一次信息的文件 收到信息后 它会发送消息popup html弹出窗口使用 JSON 信息将新的 HTML 元素附加到弹出窗口的主体上 问题是
  • 在 Chrome 扩展中使用页面的 Angular JS

    我有一个 HTML 页面 其中有一些使用 Angular 配置的 DOM 现在我正在构建一个 chrome 扩展来修改文本框中的值 element value newValue不起作用 因为文本框是用 Angular 设计的 在阅读了一些资

随机推荐

  • 使用 Postman 访问 OAuth 2.0 Google API

    我正在尝试访问邻近谷歌API using 邮递员 Chrome 应用程序 我已按照邮递员和谷歌开发网站上的教程进行操作 但仍然收到 401 错误消息 我在做什么 第 1 步 启用 Proximity API 为了使用 Proximity A
  • :app:processDebugResources 的executeTaskAction 失败

    我收到此错误消息 构建 构建失败 gt 运行构建 gt 运行任务 gt app processDebugResources gt executeTaskAction 下面显示的代码顺序为 错误消息 然后 build gradle Proje
  • 为什么Python中主进程退出时子进程(daemon=True)不退出?

    这是官方的解释daemonpython 多处理中的标志 当进程退出时 它会尝试终止其所有守护子进程 据我了解 父进程退出时会杀死其守护进程标志设置为 True 的子进程 下面是我用来证明我的猜测的代码 但结果不同 import multip
  • 打字稿条件:backend_layout(带幻灯片)

    我用这个条件 globalVar GP colPos 0 page backend layout pagets MainTemplate 我的问题是我的 子页面 没有选择 backend layout 因为设置了父页面 后端布局 此页面的子
  • C函数内存分配

    在 C 语言中 函数何时分配以及它在内存中的何处 函数的内存是在第一次编译程序时分配的 还是在第一次看到函数调用时分配的 它是分配在堆栈上还是在代码段中 你的问题问得很好 但是要做好应对一些额外复杂性的准备 因为其中一些东西会接触到运行代码
  • 使用 AutoHotKey 查找并填写输入字段

    对所有 AutoHotKey 大师的挑战 给我们一个函数查找并移动光标到输入字段 例如登录名 或者发送输入文本 对于像我这样又老又懒的黑客来说 只是摆弄 AHK 它看起来像这样 FindFillField elementid sendtex
  • Javascript Array.some() 和 Array.every() 相当于 Set?

    在 JavaScript 中 是否有等价的Array some and Array every 为了Set内置对象 不 唯一的内置方法Set prototype are Set prototype add Set prototype cle
  • 从 &str 数组获取 Iterator

    我正在尝试抽象一个函数来获取两个实例std str Lines以及用于测试目的的模拟版本 由一系列创建 str 我的代码 确实有效 看起来像这样 use std fs test fn test day 1 let v 3 3 4 2 4 i
  • 如何解决“Newtonsoft.Json.JsonSerializationException无法找到用于类型的构造函数”Android错误?

    我正在使用 Unity3D 开发应用程序 我将我自己的实用程序 DLL 与一些类一起使用 我已经工作了几个月了 并且毫无问题地进行了很多构建 编译 上周向 DLL 添加了一个新类 它在我的 PC 中运行良好 但当我构建该项目并在我的 And
  • Pymunk 伺服关节

    如何在 Pymunk 中实现 伺服 关节 我正在尝试创建一个简单的模型 其中一个盒子在其下方的一条细 腿 上保持平衡 我已经能够创建一个盒子并使用PinJoint 但似乎没有任何方法可以控制连接连接到盒子的角度 我希望能够指定附着角度 其他
  • 在 scons 'Program' 命令中使用 'LIBS' 找不到静态库,为什么?

    我有一个 n c 作为主函数 o c 作为导入函数 如下所示 cat n c o c int f int main f return 0 include
  • 将节点附加到现有的 xml-Java

    我已经看到 vb 和 c 回答了同样的问题 但我需要一个 Java 最佳解决方案来将节点附加到 xml xpath 有帮助吗 我有 a b b a
  • 在 Ember.CollectionView 渲染结束时运行 jquery

    我有一个容器视图其中包含一个集合视图 在这之后集合视图呈现在屏幕上我需要执行jquery函数它本质上是查看渲染模板的内容并执行一些显示修改 如果我在插入元素 of 集合视图它可以工作 但它会针对中的每个元素执行集合视图因为我真的只需要在最后
  • 如何在气泡图中的 ggplot 2 中设置 geom_vline 和 geom_hline 的背景

    我想在气泡图上添加一条垂直线和一条水平线 而不过度绘制气泡 数据来了 a lt c np prepp vp animal artifact communication ipv isv b lt c 0 51 0 32 0 85 0 61 0
  • 正则表达式意外结束

    我只想从路径中获取带有扩展名的文件名 C Users anandada workspace MyTestProject src OpenTest c 以下声明 fileName re match c fileName 给出错误 正则表达式意
  • React.addons.createFragment 对象中元素的顺序

    我正在读https facebook github io react docs create fragment html文章中发现 FB 工程师依赖于对象内存布局 属性的顺序 if this props swapped children R
  • 如何在codeigniter中获取具有特定id的最后一条记录

    我这里有 2 张桌子 第一个是customer其次是会员资格 现在我只想得到一个特定的最后一条记录customer id从这些联合表 客户和会员 中 这是我的客户表结构 这是我的成员资格表结构和所需的最新插入行 这里我自己尝试了一个代码 r
  • 在Web浏览器中查找并单击html代码中没有ID的按钮

    我基本上有一个网络浏览器控件 它正在浏览并自动完成一些表单 到目前为止 这很容易 但是我已经得到了一个没有标有 ID 或 提交 或 重置 按钮的表单姓名 我需要能够同时单击两者 示例 提交按钮 td align right valign m
  • iCloud 是否需要在生产环境中才能在生产中使用?

    I added Cloudkit support to my iOS and WatchOS App but I cannot deploy my schema to production due to a bug Do I need to
  • javascript:从回调函数调用对象内部的函数

    当我尝试使用回调函数中的 this 调用对象内部的函数时 会发生错误 指出该方法未定义 我该如何解决这个问题 var object log user pass error message an error occured while con