# 包装器
# 定义
当我们需要改变一个函数的功能,但是又不想直接改动函数内部的功能逻辑,我们就可以使用一个包装器来包装起来。
# 例子
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);
# 好处
- slow 函数是可重用的。
- 缓存逻辑是独立的,不会增加 foo 的函数代码。
- 我们可以组合任意多个装饰器.
# 版本二
传递返回函数的上下文给原始函数。
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;
}
}
← 偏函数 实现 setInterval →