回调函数的用处

2023-11-27

在 Javascript 中,可以定义一个函数 X 并将其作为参数传递给另一个函数 Y。

这样的函数 X 称为callback function.

您能否解释为什么在一些清晰的示例中使用回调函数很有用(例如发送一些带有演示的小提琴链接)?我可以看到一个有用之处,那就是代码可读性,但我对此不确定,因为带有回调的代码看起来更复杂。

唯一的用处是它在浏览器环境中的使用和AJAX中的异步执行? 其他 Javascript 实现怎么样(例如Rhino)?回调在那里也有用吗?或者它们的有用性仅取决于 Javascript 的执行环境?

谢谢


回调作为参数

回调很有用,因为它们允许您使用以下命令“配置”函数code.

典型的例子是一个排序函数,它允许您指定自己的排序标准。我将使用一个函数,该函数根据某些条件返回数组的最小值,因为它比排序更简单,但它仍然可以很好地作为说明:

function min(collection, property) {
    if (collection.length == 0) {
        return null;
    }

    var minIndex = 0;
    var minValue = collection[0][property];
    for (var i = 1; i < collection.length; ++i) {
        if (minValue > collection[i][property]) {
            minValue = collection[i][property];
            minIndex = i;
        }
    }

    return collection[minIndex];
}

var items = [
    { name: "John", age: 20 }, { name: "Mary", age: 18 }
    ];

alert(min(items, 'age').name); // prints "Mary"

看到这段代码运行. 它有什么问题呢?

问题是,虽然我们做了一些努力来创建一个可配置的min函数(它根据我们指定的任何属性找到最小值),但从一般意义上来说它仍然相当有限,因为它只能根据一个单一属性找到最小值.

如果我们的数据是这样的怎么办?

var items = [ "John/20", "Mary/18" ];

这不再是一个对象数组,而是一个格式化字符串数组。它具有与原始集合相同的数据,但结构不同。结果,原来的min不能使用函数来处理它。

现在我们可以编写另一个版本min它适用于字符串而不是对象,但这有点毫无意义(有无数种方法可以表示相同的数据)。对于一种特定情况,这可能是一种快速但肮脏的解决方案,但是考虑图书馆作家的问题:如果不知道每种情况下数据的结构如何,他们如何编写一个对每个人都有用的函数?

回调来救援

简单:制作min通过允许用户指定功能更强大如何从数据中提取标准。这听起来很像“给出函数代码以从数据中提取标准”,这正是我们要做的。min将接受一个callback:

function min(collection, callback) {
    if (collection.length == 0) {
        return null;
    }

    var minIndex = 0;
    var minValue = callback(collection[0]);
    for (var i = 1; i < collection.length; ++i) {
        if (minValue > callback(collection[i])) {
            minValue = callback(collection[i]);
            minIndex = i;
        }
    }

    return collection[minIndex];
}

var items = [ "John/20", "Mary/18" ];

var minItem = min(items, function(item) {
    return item.split('/')[1]; // get the "age" part
});

alert(minItem);

看到这段代码运行.

现在我们的代码终于可以重用了。我们可以轻松地将其配置为与第一个一起使用and第二种类型的数据只需最少的努力。

查看支持回调的函数处理两种类型的数据。这是我们获得极大灵活性的结果,因为允许用户以回调的形式提供代码作为我们函数的一部分运行。

异步编程中的回调

回调的另一个主要用途是启用异步编程模型。这在您计划完成操作但不希望程序在操作完成之前停止运行的所有情况下都很有用。

为了使其工作,您为该操作提供回调函数并有效地告诉它:去帮我做这个工作,完成后给我回电话。然后,您可以自由地继续做任何您喜欢的事情,因为您知道当结果可用时您指定的函数将运行。

这在使用 AJAX 的 Web 中最为明显:您向 Web 服务器发出请求,然后当收到回复时你以某种方式对其采取行动。您不想当场等待响应,因为这可能需要很长时间(例如,如果存在连接问题),并且您不希望您的程序一直没有响应。

有关 AJAX 回调的示例,请参阅 jQuery 的文档load功能。

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

回调函数的用处 的相关文章

  • C++ 实现友元/内联函数

    我似乎找不到这个新手问题的答案 如果我有课 头文件 h Class X public friend bool operator const X const X inline size type rows const ETC 当我去实现X的
  • 之后的脚本会阻止 DOM 加载

    考虑以下代码 div class box div 令我惊讶的是 DOM 延迟了十秒的加载 10秒后出
  • 如何使用 Angular 1.5 中的组件为每个页面设置标题

    我最近开始使用 Angular 1 5 组件 我的应用程序中有多个页面 所以我决定创建一个
  • Web Worker 中的 RequireJS

    我正在尝试在网络工作者中使用 RequireJS 问题是我在使用它时不断收到以下错误 Uncaught Error importScripts failed for underscore at lib underscore js 我已经测试
  • 该脚本在 IE 中不起作用。我该如何修复它?

    有一个脚本可以根据用户的显示器屏幕分辨率更改页面模板 但是 它在 IE 中不起作用 请告知如何修复它 table align center tr td head td tr tr td nbsp td td nbsp td td nbsp
  • 最小有效 JSON 是多少?

    我仔细阅读了 JSON 描述http json org http json org 但我不确定我是否知道这个简单问题的答案 最小可能的有效 JSON 字符串是什么 string 该字符串是有效的 JSON 吗 42简单的数字是有效的 JSO
  • 如何使用 JavaScript 或 jQuery 清除 Google Chrome、Mozilla Firefox 和 Safari 中的剪贴板数据

    我正在开发一个网站 我想在使用 JavaScript 或 jQuery 查看我的网站时按下打印屏幕按钮时清除剪贴板数据 谁能帮我解决这个问题 我在 Internet Explorer 中成功处理了这个问题 提前致谢 由于安全原因 您无法使用
  • Angular JS未知提供者错误

    删除 Bower components 并清理缓存后 我使用 Bower install 重新安装了依赖项 该应用程序无法加载并出现以下错误 未捕获的错误 injector unpr 未知提供程序 forceReflowProvider 这
  • 使用express记录所有GraphQL响应

    我成功地设置了记录 graphQL 错误 app use graphql graphqlHTTP request gt return schema rootValue request formatError error gt const p
  • 对 UPDATE 行的 POST 请求

    我是 javascript 的新手 所以我正在寻找一些帮助来创建一种拖放地理编码标记的方法 以允许交互式更改地址 我相信通过更新 LOCATION 列行可以实现这一点 第一步是 发送 POST 请求 对吧 好吧 所以我想问是否有人可以给我看
  • 向Java类库添加函数

    我使用的 Java 类库在很多方面都不完整 有很多类我认为应该内置其他成员函数 但是 我不确定添加这些成员函数的最佳实践 让我们调用不足的基类A class A public A long arbitrary arguments publi
  • 无法使用 Excel JavaScript API 设置 NumberFormat

    我正在使用 Excel Javascript API 在搜索文档后 仍然找不到我想要实现的解决方案 因此 我想将所有内容设置为数字格式 文本 这样 Excel 的自动格式设置就不会与任何单元格的内容混淆 不会删除前导零或更改日期格式 文档建
  • Ace Editor 自动完成和多种语言

    如何为 Ace 编辑器创建自动完成功能以及如何突出显示 php 中的 html javascript 和 csshttp ace ajax org http ace ajax org
  • 以编程方式在 Highcharts 中使用缩放绘制矩形和线条

    我正在使用 Highcharts 进行一些编程绘图Highcharts Renderer http api highcharts com highcharts Renderer using path and rect 在下面的代码中 我手动
  • 单击行内的按钮时防止触发表行 onclick 事件

    我有一个带有 ONCLICK 事件的表行 切换下面的附加数据 在其中一个行单元格内有一个按钮 单击时执行 AJAX 操作 当我单击按钮时 行的 onclick 事件也会触发 并且会发生附加数据在 AJAX 调用完成之前出现 这对我来说是一个
  • 谷歌地图的灰度

    有没有什么方法可以在不丢失任何其他功能的情况下以灰度显示 Google 地图 通过 Javascript API 嵌入 是的 他们在 api V3 中引入了StyledMaps http code google com apis maps
  • 使用 Javascript 从 HTML 表格输入单元格获取值

    我使用 Javascript 动态创建了一个 HTML 表 其中第一列由文本字段组成 第二列由输入字段组成 第三列由文本字段组成 效果很好 nrOfRows document getElementById myId value get nr
  • 带数字键的 Immutable.js 映射(包括性能测试)

    我在 React Native 应用程序中将 Immutable js 与 Redux 结合使用 元数据 例如查找表 是从服务器获取的 并作为 Immutable Map 保存在应用程序本地 查找值的键是整数 数据库中的主键 当我获取数据时
  • 如何在不接受焦点的元素上捕获键盘事件?

    我知道要处理输入字段中的键盘事件 您可以使用 input keyup function e var code e keyCode and 13 is the keyCode for Enter 但是 现在 我有一些div and li元素
  • Tizen SDK:找不到变量:tizen

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

随机推荐

  • Zend Framework 布局中的图像

    我在这里有点迷失 解决方案可能潜伏在我的鼻子底下 但我无法得到 想到你们是否有人可以提供帮助 问题是这样的 我有 Zend Framework 标准文件布局 Project application controllers views lay
  • 是否可以使用 JavaScript 读取 Firefox、Safari 和 Chrome 中的剪贴板?

    我正在尝试使用 JavaScript 读取剪贴板的内容 通过 Internet Explorer 可以使用该功能 window clipboardData getData Text 在 Firefox Safari 和 Chrome 中是否
  • 类定义之外的部分模板特化

    我可以在类声明中使用部分模板专业化 template
  • 如何使用javascript检查文件是否被选择?

    在 php 中 这是检查文件是否被选择的方法 FILES item size gt 0 那么在 JavaScript 中呢 我需要知道 因为我有一个只有在选择文件时才起作用的函数 http www w3 org TR DOM Level 2
  • 从逗号分隔的字符串中删除重复项

    是否有更好 更快 的解决方案来从逗号分隔的字符串中删除重复项 public function d dep if strpos dep false nd explode dep oa array unique nd nx count oa g
  • 使用 JDBC 连接到 SQL Server LocalDB

    是否可以使用 JDBC 连接到 SQL Server LocalDB 看起来 截至 2011 年 12 月 这是不可能的 您知道解决方法或状态更改吗 对的 这是可能的 使用 jTDS 的 LocalDB 实例的连接字符串如下所示 jdbc
  • Braintree - paymentMethodNonce 未收到调用

    我已经为 Braintree 设置了 dropin UI 我可以很好地看到用户界面 在此之前 我创建了客户 我可以在 Braintree sandbox 上看到该客户 现在我想向客户添加付款方式 我正在尝试以下代码 但 paymentMet
  • 用于验证文件夹名称和文件名的正则表达式

    我想验证文件名 文件或文件夹的名称不应包含 您能否建议我在 preg match 中使用的正则表达式 Thanks 使用该方法会更有效strpbrk 功能 if strpbrk filename lt gt FALSE filename i
  • 拆分列表并从子列表中求和?

    我正在为我的 Haskell 课程寻找解决方案 我有一个数字列表 我需要为列表的每个部分返回 SUM 部分除以 0 我需要使用 FOLDL 函数 Example 初始列表 1 2 3 0 3 4 0 5 2 1 子列表 1 2 3 3 4
  • 为什么 CROSS JOIN 条件在“ON”子句中不起作用,而仅在 WHERE 子句中起作用?

    我想知道为什么条件交叉联接必须具有 WHERE 子句中指定的条件 以及为什么它在 ON 子句中不起作用 请参阅编译示例的链接 http rextester com IKY8693 业务上下文 我需要生成开始日期和结束日期之间的日期列表 以便
  • 如何为不接受取消令牌的异步函数设置超时?

    我的网络请求是由这段代码处理的 Response await Client SendAsync Message HttpCompletionOption ResponseHeadersRead CToken 在读取响应标头之后 内容读取完成
  • 类型提示 - 指定对象数组

    如何将参数类型指定为数组 假设我有一个名为 Foo 的类 class Foo 然后我有一个接受该类类型作为参数的函数 function getFoo Foo f 当我传入一个 Foo 数组时 我收到一个错误 说 可捕获的致命错误 参数 1
  • Linux新手问题:GCC编译器输出

    我对 Linux 完全是个新手 我在笔记本电脑上安装了 Mint 最近一直在玩它 我写了一个简单的C程序并保存了文件 然后在命令行中我输入 gcc c myfile 然后弹出一个名为 a out 的文件 我天真地 在使用 Windows 多
  • 如何从 XML 反序列化抽象类的具体实现

    我有一个带有几个具体实现的抽象类 这需要序列化为 XML 才能发送到另一个系统 这工作正常 但是 我还需要能够反序列化相同的 XML 结构 无论我如何尝试 我似乎都无法做到这一点 我的班级结构如下 抽象类 XmlIncludeAttribu
  • 为什么 MAX() 比 ORDER BY ... LIMIT 1 慢 100 倍?

    我有一张桌子foo与 以及其他 20 个 列bar baz and quux索引打开baz and quux 该表有约 500k 行 为什么以下查询的速度差异如此之大 查询A需要0 3秒 而查询B需要28秒 Query A select b
  • 在 R 中读取空格分隔的数字

    我在 R 中有这个字符串 numbers lt 4 4956 1 00e 09 50 9 1 244 47 1 1 04 5 5 0 499 13 9 0 我应该将数字读入向量中 现在我可以找到其他语言的相同线程 但这里找不到 R 的线程
  • 如何将保存图像更改为文件默认名称?

    我有一个由 Caman js 创建的画布 HTML5 标签 当我在 FF 中单击右键并保存到文件时 文件的默认名称是 canvas png 由于我创建了很多文件并需要保存它们 这很不幸 因为我需要为每个文件设置不同的名称 我想要完成的是 当
  • 如何在 SQLExpress 文本字段中插入中文字符?

    如何在 SQLExpress 文本字段中插入中文字符 我使用的是 VS 2008 中的 SQL Express 当我添加中文字符时 无论是通过我编写的导入应用程序还是从 Visual Studio 内的数据视图粘贴它们 它们最终都会变成问号
  • View.OnClickListener() 函数或接口

    View OnClickListener 是函数还是接口 当我们尝试在 android 中设置 onclicklistener 方法时 我们使用 new View OnClickListener 据我所知 它让我感到烦恼 我们不需要初始化包
  • 回调函数的用处

    在 Javascript 中 可以定义一个函数 X 并将其作为参数传递给另一个函数 Y 这样的函数 X 称为callback function 您能否解释为什么在一些清晰的示例中使用回调函数很有用 例如发送一些带有演示的小提琴链接 我可以看