gpt4 book ai didi

Bind 与 curry* 的 JavaScript 用法?

转载 作者:行者123 更新时间:2023-12-02 22:24:39 26 4
gpt4 key购买 nike

我试图理解 currybind 之间的区别。

bind的实现是:

/*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 的实现是:

/*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 不是一个内部函数(与 IE9+ 中的 bind 不同)。但仍然:

为什么我听到人们一直在谈论 curry ,而他们可以简单地使用 bind 操作?

唯一的区别是上下文实际上只能在 bind 函数中找到。

differences

enter image description here

示例:

假设我有这个功能:

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)函数添加虚拟上下文。

我错过了什么?

最佳答案

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

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

关于Bind 与 curry* 的 JavaScript 用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22127889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com