# 包装器

# 定义

当我们需要改变一个函数的功能,但是又不想直接改动函数内部的功能逻辑,我们就可以使用一个包装器来包装起来。

# 例子

function foo(a) {
    return a;
}

我们想要缓存这个功能
function foo(a) {
    var cache = [];
    return function () {
        if (!cache[a]) {
            cache[a] = a;
        }
        return cache[a];
    }
}
我们可这样子就已经修改了 foo 的源码。假如我们不想动它呢?
function foo(a) {
    return a;
}
function slow (fn) {
    var cache = {};
    return function (a) {
        if (cache[a]) {
            return cache[a];
        }
        let result = fu(a);
        cache[a] = result;
        return result;
    }
}
var m = slow(foo);
m(2);
m(3);

# 好处

  1. slow 函数是可重用的。
  2. 缓存逻辑是独立的,不会增加 foo 的函数代码。
  3. 我们可以组合任意多个装饰器.

# 版本二

传递返回函数的上下文给原始函数。
function slow (fn) {
    var cache = {};
    return function () {
        if (cache[a]) {
            return cache[a];
        }
        // let result = fn.call(this, ...arguments);
        let result = fn.apply(this, arguments);
        cache[a] = result;
        return result;
    }
}