这个memoize功能如何工作?

时间:2013-02-08 23:08:05

标签: javascript

我今天感觉非常愚蠢。 我一直在看这段代码,试图追踪它,但我无法弄清楚:

  1. 实际上意味着什么
  2. 工作原理
  3. 据我所知,第一次被称为actioncallFn相同的时间。因此,它第一次运行时会创建堆栈数组。然后我失去了它。操作被分配一个函数,只是将传递的回调添加到堆栈。然后fn 实际被调用,并根据其结果,“action”被设置为callFn(?!?)或调用回调的函数...然后,所有调用堆栈被称为。

    我讨厌迷失在代码中,但这有点超出我的意义。任何比我聪明的人能够“得到它”吗?

    var memoize = function(fn) {
        var callFn = function(callback) {
            var stack = [callback];
    
            action = function(callback) {
                stack.push(callback);
            };
    
            fn(function(err, val) {
                action = err ? callFn : function(callback) {
                    callback(null, val);
                };
    
                while (stack.length) stack.shift()(err, val);
            });
        };
    
        var action = callFn;
    
        return function(callback) {
            action(callback);
        };
    };
    

2 个答案:

答案 0 :(得分:1)

它不仅会记住fn的结果,而且还确保每次只有一个fn的有效呼叫。在活动调用期间提供的每个callback(当action是来自第5行的anon函数时)被推送到堆栈上,并且一旦fn回调堆栈(它实际上是一个队列)处理并将结果发布到所有回调。

令人困惑的“ action设置为callFn或...... ”基于err条件发生。此参数indicates that an error happened,否则为假。因此,当fn回调错误时,堆栈会照常处理,而action 重置也会原始callFn(你记得,它有此值也在开头,因此后续调用将重试以从fn获取值。如果没有错误,action只会设置为一个函数,该函数始终回调一次返回的结果val

答案 1 :(得分:0)

Memoization是一种使用副作用来改进-at runtime - 函数性能而不改变其行为的技术。粗略地说,您可以通过存储先前调用中返回的函数值来执行memoization,并在对函数的进一步调用中返回这些值,而不是实际调用函数。

Read more