函数式编程之影象 js

函数式编程之影象
是一种时候换空间的要领,用捐躯空间的复杂度来调换时候的复杂度

字符串衔接

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的影象折腾终了~

    原文作者:小小____
    原文地址: https://segmentfault.com/a/1190000015652926
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞