柯里化变量
由于“闭包”只是一种表达函数始终保留其原始变量范围的方式,因此有许多方法可以利用它。
柯里化似乎是人们喜欢的东西。
创建柯里化值操作器
在这里,我创建了一个名为curry
的函数,该函数将返回一个函数,该函数将用于生成与原始柯里化值一起工作的新函数。
function curry() {
var args = Array.prototype.slice.call(arguments);
return function(fn) {
return function() {
var args2 = Array.prototype.slice.call(arguments);
return fn.apply(this,args.concat(args2));
};
};
}
创建一个柯里化字符串的函数
如果我想创建处理字符串的函数,我可以将字符串进行柯里化...
var workWithName = curry("Bubba");
创建一个函数,将柯里化后的字符串放入句子中
创建一个函数,将柯里化后的字符串放到句子中
在这里,我创建了一个名为talkToName
的函数,该函数会根据传入的参数将名称合并到不同的句子中...
var talkToName = workWithName(function(curried_str, before, after) {
return before + curried_str + after;
});
现在我有一个talkToName
函数,它接受两个字符串,这些字符串包装了柯里化的字符串。
talkToName("Hello there ", ". How are you?"); // "Hello there Bubba. How are you?"
talkToName("", " is really super awesome."); // "Bubba is really super awesome."
注意,我向“talkToName”函数传递了两个参数,但是传递给“workWithName”的函数接受3个参数。
第一个参数由我们从“workWithName()”创建的函数传递,而我们给“talkToName”提供的两个参数将在原始柯里化参数之后添加。
创建一个函数,递增柯里化字符串的字符
在这里,我使用原始的“workWithName”函数创建一个完全不同的函数,该函数将获取“Bubba”字符串,并返回按给定值递增的字母字符串...
var incrementName = workWithName(function(curried_str, n) {
var ret = '';
for(var i = 0; i < curried_str.length; i++) {
ret += String.fromCharCode(curried_str[i].charCodeAt() + n);
}
return ret;
});
所以,我将我的新的incrementName
函数传入一个数字,它会递增名称中的字母,并返回新的字符串...
incrementName(3); // "Exeed"
incrementName(8); // "J}jji"
incrementName(0); // "Bubba"
你可以看到,我们给curry()
赋了一个值,然后它返回一个函数,可以用来创建新的函数,这些函数可以与原始值一起使用。
再次注意,我向incrementName
函数传递了一个参数,但是传递给workWithName
的函数接受2个参数。第一个参数是柯里化的。
其他数字示例
下面是一个示例,创建一个函数生成器,可与数字3
和5
一起使用。
var workWith3And5 = curry(3, 5);
创建可对已柯里化数字执行各种操作的函数
使用workWith3And5
函数,我们可以创建一个新函数来接收一个数字参数,并返回一个由给定数字与已柯里化数字之和组成的数组...
var addNTo3And5 = workWith3And5(function(x, y, n) {
return [3 + n, 5 + n];
});
addNTo3And5( 8 );
addNTo3And5( -4 );
使用相同的workWith3And5
函数,对数字3
和5
进行柯里化,创建一个3 x 5的数组,其中嵌套的数组给定了一些内容...
var create3By5GridWithData = workWith3And5(function(x, y, data) {
var ret = []
for(var i = 0; i < x; i++) {
ret[i] = [];
for(var j = 0; j < y; j++) {
ret[i][j] = data;
}
}
return ret;
});
create3By5GridWithData( 'content' );
setTimeout()
/clearTimeout()
包装对象,可以为您管理计时器 ID。 - nnnnnn