函数式编程之影象
是一种时候换空间的要领,用捐躯空间的复杂度来调换时候的复杂度
字符串衔接
function f() {
var s = arguments.length + Array.prototype.join.call(arguments);
console.log(s);
};
这里运用的是Array.prototype.join要领举行字符串衔接
返回的是衔接的效果
接下来,写一个具有影象的函数
// 这是一个用于返回f()的带有影象功用的函数
function memorize(f) {
var cacho = {}; // 定义一个用于保留值的私有变量
return function() {
var key = arguments.length + Array.prototype.join.call(arguments, ',');
if (key in cacho)
return cacho[key];
else
return cacho[key] = f.call(this, arguments);
};
}
这是一个具有影象的函数,用数组的长度和数组兼并后构成的字符串作为属性名,举行保留,假如这个值存在则直接举行保留,假如值不存在则举行保留并返回(由于赋值语句会返回右值,所以return语句后无需再跟举行返回值的语句)
运用调试函数对其举行修正
// 这是一个用于返回f()的带有影象功用的函数
function memorize(f) {
var cacho = {}; // 定义一个用于保留值的私有变量
console.log(cacho);
return function() {
var key = arguments.length + Array.prototype.join.call(arguments, ',');
console.log(key);
if (key in cacho) {
console.log(cacho[key]);
return cacho[key];
}
else {
console.log(f.call(this,arguments));
return cacho[key] = f.call(this, arguments);
};
};
}
如许就越发的显著了
运用这个函数
返回两个整数的最大公约数
欧几里得算法
function gcd(a, b) {
var t; // 用于保留中心变量
if(a < b) // 确保 a >= b
t = a, a = b, b = t;
while(t != 0)
t = a % b, a = b, b = t;
return a;
}
应用欧几里得算法写的求两个数的最大公因数,运转一下
gcd(85, 187);
17
盘算效果准确,运用方才完成的具有影象功用的高阶函数,将函数传进去,生成了一个新的函数
var functiongcd = memorize(gcd);
Object { }
运用这个函数
好吧。莫名举行死循环了。
Error: Script terminated by timeout at:
gcd@Scratchpad/1:35:9
memorize/<@Scratchpad/1:24:27
@debugger eval code:1:1
没办法继承排查毛病
排查毛病
// 这是一个用于返回f()的带有影象功用的函数
function memorize(f) {
var cache = {};
console.log(cache);
return function() {
var key = arguments.length + Array.prototype.join.call(arguments);
console.log(key);
if (key in cache) {
console.log(cache[key]);
return cache[key];
}
else {
console.log(f.apply(this,arguments));
return cache[key] = f.apply(this, arguments);
};
};
}
这个函数照旧写错了,call只能传入一个值,而apply能传入多个值
继承运转
gcdmemo(85, 187);
285,187 Scratchpad/1:17:4
17 Scratchpad/1:23:7
17
个中第一个Scratchpad/1:17:4返回指代的是
if (key in cache) {
console.log(cache[key]);
return cache[key];
}
个中第二个Scratchpad/1:23:7返回指代的是
return cache[key] = f.apply(this, arguments);
好啦,异常显著,第一步是先将值缓存进入其私有变量,即保留进入闭包内部,然后第二个是发明这个值已保留过了直接输出
(^o^)/,
js的影象折腾终了~