控制次数其实主要从两方面着手,一方面是简单的限制函数的执行次数,而另一方面可以缓存函数的执行结果。
限制函数的执行次数
对于有些场景下可能需要控制执行次数,比如设置错误重试次数5次,比如表单提交函数只允许执行一次防止重复提交。
function limit(fn, limit, context) { let current = 0; return function(...args) { if (current >= limit) { return -1; } current += 1; let ctx = context || this; return fn.apply(ctx, args); } }
function foo(id) { console.log(id); }
foo(1); foo(2); foo(3);
foo = limit(foo, 1);
foo(4); foo(5); foo(6);
|
缓存函数的执行结果
对于一些执行成本非常高的操作或者会被反复调用的操作,可以通过缓存,限制其执行次数。
function memorize(func, context) { let cache = {}; return function(...args) { let address = args.length + args.join(","); if (cache[address] === undefined) { cache[address] = func.apply(context || this, args); } return cache[address]; }; };
let count = 0; let fibonacci = n => { count ++; return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2); }
for (let i = 0; i < 10; i ++) { 2fibonacci(i); } console.log(count);
fibonacci = memorize(fibonacci); count = 0; for (let i = 0; i < 10; i ++) { 2fibonacci(i) } console.log(count);
|