Bind 与 curry* 的 JavaScript 用法?

2024-07-01

我试图理解之间的区别curry vs bind.

实施bind is :

/*1*/   Function.prototype.bind = function ()
/*2*/   {
/*3*/        var fn = this,
/*4*/           args = Array.prototype.slice.call(arguments);
/*5*/       var object = args.shift();
/*6*/       return function ()
/*7*/       {
/*8*/           return fn.apply(object, 
/*9*/                           args.concat(Array.prototype.slice.call(arguments)))
/*10*/       };
/*11*/   }

实施curry is :

/*1*/   Function.prototype.curry = function ()
/*2*/   {
/*3*/       var fn = this,
/*4*/           args = Array.prototype.slice.call(arguments);
/*5*/       return function ()
/*6*/       {
/*7*/           return fn.apply(this, 
/*8*/                           args.concat(Array.prototype.slice.call(arguments)));
/*9*/       };
/*10*/   };

我已经知道了curry不是内部函数(与bind这是在 IE9+ 中)。但仍然:

为什么我听到人们一直在谈论curry,虽然他们可以简单地使用bind手术 ?

唯一的区别是上下文实际上只能在bind功能。

差异 https://i.stack.imgur.com/SvK0d.jpg

例子 :

假设我有这个功能:

function add(x,y,z)
{
  return x+y+z;
}

我可以用curry :

alert(add.curry(2).curry(1)(4)) //7

但我也可以这样做:

alert(add.bind(undefined,2).bind(undefined,1)(4)) //7

我不明白为什么会这样curry术语函数存在,同时可以向绑定函数添加虚拟上下文。

我缺少什么?


bind强制您将上下文附加到函数,同时使用curry,您可以延迟函数上下文的指定,直到invoking柯里化函数,在很多情况下都很有用。
考虑以下示例(不是完美的示例,只是为了说明这一想法):

function Query(sessionKey, dataBuilder) {
  this.sessionKey = sessionKey;
  this.url = "http://www.example.com/search";
  this.dataBuilder = dataBuilder
  this.search = function (term) {
    $.ajax({
      type: "POST",
      url: this.url,
      data: this.dataBuilder(term);
    })
  }
}

function dataBuilder(entity, query) {
  var payload = JSON.stringify({
    'entity': entity,
    'searchTerm': query
    'session': this.sessionKey // will be always undefined if bind(undefined,...) is used
  });
  return payload
}
var bindEx= dataBuilder.bind(undefined, "username");
var curryEx= dataBuilder.curry("username");

var usernameQuery = new Query("id1234",bindEx); // won't work, this.sessionKey will be undefined
usernameQuery = new Query("id1234",curryEx); // will  work, this.sessionKey will be id1234 in the DataBuilder
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bind 与 curry* 的 JavaScript 用法? 的相关文章

随机推荐

  • Qt 如何通过QPrinter打印信息?

    我创建了新的 Qt C 项目 我想使用打印机在一张 A4 纸上打印一些消息 我整天都在阅读文档 但我不知道如何做到这一点 我理解了大部分内容 仅在文档中 但问题是 我实际上不知道应该使用所有打印机库中的哪一个 PrinterDialog q
  • 线程运行如何启动?

    我正在寻找一个关于线程的小例子 为了创建线程 我们可以通过两种方式来实现 Runnable接口或通过扩展Thread 我使用第一种方式 package test public class test implements Runnable p
  • 处理 Scala 对象构造函数中的异常

    我正在尝试使用 Lift JPA 当我引用 Model 时 它调用超级构造函数 我遇到了异常 object Model extends LocalEMF LiftPersistenceUnit with RequestVarEM 问题是这个
  • 关闭文件时关闭 vim NERDtree

    我正在尝试 Vim 安装了一些插件 其中有 NERDTree 遵循一些指南并设置了一个 vimrc 其中一半内容我还不明白 让我烦恼的是 如果我 wq vim 保持活动状态 它仅关闭文档的分屏 我最终得到了全屏 NERDTree 我希望 N
  • 在Retrofit 2.0中如何获取JSON对象而不进行转换?

    我需要从 REST 服务器下载 json 对象 而不用 GSON 进行转换 但不明白Retrofit 2 0 bata 1 中如何make 只需使用JsonElement作为你的pojo 例如 在您的 Flower Api 界面中 GET
  • 可以用 PHP 设置表单字段值吗?

    我使用 GET 函数从 url http index html variable value 中提取一个带有 php 的值 这是基本的东西 但是 我需要在我的表单中使用该值 通常 我会设置 或类似的东西 但是 我无法使用我正在使用的编辑器在
  • Java 中 getter 的命名约定有多重要?

    我非常相信一致性 因此也相信惯例 然而 我目前正在用 Java 开发一个框架 其中这些约定 特别是get set前缀约定 似乎妨碍了可读性 例如 有些课程会有id and name属性和使用o getId 代替o id 由于多种原因 这似乎
  • Android SDK Lint 工具忽略 NewAPI 警告

    我正在从 Eclipse Android SDK 运行 Lint 工具 我的设置是默认设置 并且 NewApi 在我的 Android Lint 设置中设置为错误 然而 当我运行 Lint 时 通过Package Explorer gt A
  • 什么、为什么或何时选择 cshtml 与 aspx 更好?

    我想知道什么 为什么或何时选择 cshtml 更好 什么 为什么或何时选择 aspx 技术更好 这两项技术的用途是什么 谢谢你 正如其他人已经回答的那样 cshtml or vbhtml如果您喜欢的话 提供了一个处理程序映射来加载 MVC
  • 使用maven时gpg没有默认密钥错误

    我正在尝试在中央存储库中发布我的 Maven 项目 并且我需要签署我的工件 我已经下载并安装了 gpg 并创建了我的密钥环 当我在 Eclipse 中运行 maven clean deploy 时 出现以下错误 gpg no default
  • 如何在 JRuby 中初始化 SQLite3 JDBC 驱动程序?

    如何在不使用活动记录的情况下通过 JDBC 访问 SQLite3 下面是一个使用 JRuby 1 6 6 Ruby 1 8 兼容模式 和 jdbc sqlite3 3 7 2 的示例 require rubygems require jdb
  • 如何添加对嵌入消息的反应 JDA

    当我执行命令 verify 时 我尝试发送和嵌入消息 然后它发送嵌入消息 但我找不到如何添加反应 我已经嵌入了消息并发送了它 但可以添加反应 import Main Bot import net dv8tion jda core Embed
  • clangd 中有“includePath”选项吗?

    我曾经使用 VSCodeC C https marketplace visualstudio com items itemName ms vscode cpptools扩大 这个扩展中有一个功能 在 json 文件中 称为 includeP
  • 如何在 Scala 中使 lambda 函数变得通用? [复制]

    这个问题在这里已经有答案了 大多数人可能都知道在 scala 中可以通过两种方式定义函数 即 def 方法和 lambda 方法 使 def 类型变得通用是相当简单的 def someFunc T a T insert body here
  • 设置 Emacs 并排分割缓冲区

    很多 Emacs 功能会自动分割屏幕 然而 它们的做法都是使窗户一个在另一个之上 有什么方法可以让它们分开 以便默认情况下它们是并排的吗 setq split height threshold nil setq split width th
  • Excel 读取错误:标头签名无效。如何解决?

    我正在从浏览器上传一个 Excel 文件 我正在使用 POI jar 但出现错误 标头签名无效 读取 3255307777713450285 预期为 2226271756974174256 下面是我使用过的两个jsp文件 JSP 1
  • 我想在我的 Wordpress BootStrap 导航中添加一行

    我有一个简单的网站 我想在导航上方添加一行 其中包含电话号码 也许还有一些社交链接 我的主题名为 Hestia Pro 找不到在哪里添加此额外行 我正在寻找一些关于将其添加到网站主题中的位置的指示 网站是 www gpoint co uk
  • 无法在 IntelliJ IDEA 中导入 javax.validation.constraints

    I can t import that simple library i have all jar files also i tried Ivalidate Caches Restart Maybe i have to add valida
  • 使用 Docker 的多节点 Hadoop 集群

    我正处于多节点的规划阶段Hadoop簇于一个Docker基础环境 所以应该是基于一个轻量级易用的虚拟化系统 当前架构 关于文档 包含 1 个主节点和 3 个从节点 本主机使用HDFS文件系统和KVM用于虚拟化 整个云由以下人员管理Cloud
  • Bind 与 curry* 的 JavaScript 用法?

    我试图理解之间的区别curry vs bind 实施bind is 1 Function prototype bind function 2 3 var fn this 4 args Array prototype slice call a