javascript - 这个内存功能是如何工作的?

标签 javascript

我今天感觉自己很蠢。 我一直在查看这段代码,试图追踪它,但我就是无法弄清楚:

  1. 它的实际用途
  2. 工作原理

据我所知,第一次调用它是唯一一次 actioncallFn 相同。因此,第一次运行时,它会创建堆栈数组。然后我就失去了它。 Action 被分配了一个函数,该函数仅将传递的回调添加到堆栈中。然后 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);
    };
};

最佳答案

它不仅记住 fn 的结果,还确保一次只有一个对 fn 的有效调用。在事件调用期间提供的每个回调(当操作是第 5 行的匿名函数时)都会被推送到堆栈上,并且一旦 fn回调堆栈(实际上是一个队列)被处理,并将结果发布到所有回调。

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

关于javascript - 这个内存功能是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782812/

相关文章:

javascript - 使用 CSS 的逐个字母的文本外观动画

javascript - @property of an object, tslint 给出错误 - no-redundant-jsdoc

javascript - 为什么我的 jquery 数据没有显示在我的 HTML 页面中

asp.net - HttpRequest、HttpResponse 和 HttpConfusion

javascript - 展开 JS 对象并转换数组

javascript - 在指令外调用作用域变量

javascript - 移动浏览器和桌面 Firefox 浏览器上的 D3.js 热图问题

javascript - 定义一个像 jQuery UI 中的 UI 元素

javascript - 需要知道如何根据我点击的按钮来选择变量(Javascript)

匹配 '|' 且前面没有 '\' 的 JavaScript 正则表达式(lookbehind 替代方案)